你如何真正从UIMenuController中删除Copy

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)

  • 不,它不适用于iOS5中的默认选择器,如剪切,复制,粘贴,选择,selectAll,定义,建议.即使我返回NO,这些仍然显示.这既不适用于UITextField,也不适用于UIWebView. (3认同)

Can*_*soy 7

对于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)

这意味着如果用户为每个动作输入多个字符(这意味着用户可能正在粘贴某些内容.)不要在文本字段中接受它.

强制用户输入电子邮件等文本字段是一种很好的做法

  • canPerformAction在IOS> 5.1中有效.问题是你在委托类中处理canPerformAction.canPerformAction在UITextField本身上调用,而不是在委托上调用.为了使canPerformAction起作用,您应该在UITextField子类中覆盖canPerformAction. (2认同)