lfa*_*lin 21 cocoa-touch uimenucontroller ios
当您添加多个自定义菜单项时,显然有一种简单的方法可以防止"更多..."标签出现在UIMenuController中.您只需删除所有系统菜单项.这里甚至有一个解决方法,仍然有复制工作.您只需使用不同的选择器实现自定义复制命令,然后覆盖canPerformAction:withSender:不显示系统副本:
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(copy:))
return NO;
else
// logic to show or hide other things
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种方法不再有效(至少在UIWebView子类中).canPerformAction:withSender:为除copy之外的每个系统菜单项调用:因此结果是始终显示系统复制菜单项.这意味着如果您有多个自定义菜单项,它们始终隐藏在"更多..."后面
那么,有没有办法真正删除系统的复制项目或一些替代方法,以防止菜单项隐藏在"更多......"后面?
更新
这是我覆盖canPerformAction时得到的输出:withSender:注意该方法永远不会被调用为"copy:"动作:
cannot perform action cut: with sender <UIMenuController: 0x7227d30>.
cannot perform action select: with sender <UIMenuController: 0x7227d30>.
cannot perform action selectAll: with sender <UIMenuController: 0x7227d30>.
cannot perform action paste: with sender <UIMenuController: 0x7227d30>.
cannot perform action delete: with sender <UIMenuController: 0x7227d30>.
cannot perform action promptForReplace: with sender <UIMenuController: 0x7227d30>.
cannot perform action _showMoreItems: with sender <UIMenuController: 0x7227d30>.
cannot perform action _setRtoLTextDirection: with sender <UIMenuController: 0x7227d30>.
cannot perform action _setLtoRTextDirection: with sender <UIMenuController: 0x7227d30>.
can perform action customCopy: with sender <UIMenuController: 0x7227d30>.
can perform action custom1: with sender <UIMenuController: 0x7227d30>.
cannot perform action custom2: with sender <UIMenuController: 0x7227d30>.
can perform action custom3: with sender <UIMenuController: 0x7227d30>.
can perform action custom4: with sender <UIMenuController: 0x7227d30>.
cannot perform action cut: with sender <UIMenuController: 0x7227d30>.
cannot perform action select: with sender <UIMenuController: 0x7227d30>.
cannot perform action selectAll: with sender <UIMenuController: 0x7227d30>.
cannot perform action paste: with sender <UIMenuController: 0x7227d30>.
cannot perform action delete: with sender <UIMenuController: 0x7227d30>.
cannot perform action promptForReplace: with sender <UIMenuController: 0x7227d30>.
cannot perform action _showMoreItems: with sender <UIMenuController: 0x7227d30>.
cannot perform action _setRtoLTextDirection: with sender <UIMenuController: 0x7227d30>.
cannot perform action _setLtoRTextDirection: with sender <UIMenuController: 0x7227d30>.
Run Code Online (Sandbox Code Playgroud)
lem*_*nar 13
你联系的技术似乎仍然有效.我UIWebView用这些方法实现了一个子类,只出现了A和B项.
+ (void)initialize
{
UIMenuItem *itemA = [[UIMenuItem alloc] initWithTitle:@"A" action:@selector(a:)];
UIMenuItem *itemB = [[UIMenuItem alloc] initWithTitle:@"B" action:@selector(b:)];
[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:itemA, itemB, nil]];
[itemA release];
[itemB release];
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
BOOL can = [super canPerformAction:action withSender:sender];
if (action == @selector(a:) || action == @selector(b:))
{
can = YES;
}
if (action == @selector(copy:))
{
can = NO;
}
NSLog(@"%@ perform action %@ with sender %@.", can ? @"can" : @"cannot", NSStringFromSelector(action), sender);
return can;
}
Run Code Online (Sandbox Code Playgroud)
对于ios> = 5.1 canPerformAction:(SEL)动作withSender :( id)发送者不再工作.
如果您只是禁用粘贴操作,那么这里有一个方法:
将UITextFieldDelegate添加到您查看控制器并实现这样的方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if(textField == txtEmailRe)
return ((string.length) > 1 ? NO : YES);
}
Run Code Online (Sandbox Code Playgroud)
这意味着如果用户为每个动作输入多个字符(这意味着用户可能正在粘贴某些内容.)不要在文本字段中接受它.
强制用户输入电子邮件等文本字段是一种很好的做法
| 归档时间: |
|
| 查看次数: |
21469 次 |
| 最近记录: |