UIKit框架的UITextFieldUITextViewUIWebView是默认支持拷贝-剪切-黏贴这类功能(UIMenuController),但有时我们需要禁用这类功能,就比如我现在做的项目。要禁用此类功能很简单,主要有2步(以UITextField为例):

1)定义UITextField子类CustomTextField

2)在CustomTextField中重写函数:

- (BOOL)canPerformAction:(SEL)actionwithSender:(id)sender{
    return NO;
}

返回值为NO,标识禁用所有的actionCutCopyPaste等)。

这样一来,只需要在项目中使用CustomTextField即可。

 

注意:如果不定义UITextField的子类,可以通过CategoryUITextField重写canPerformAction函数,但结果是所有的UITextField的实例都会禁用UIMenuController功能。


补充:UIMenuController实例调用update函数会进行Menu的刷新,例如第一次出现的menu上有select和selectAll,选择select或selectAll后会接着出现新的menu(cut/paste/copy)。这种实现方法主要是在select和selectAll函数里调用了update函数,使得menu进行更新。

- (void)select:(id)sender{
    [self becomeFirstResponder];//必须要调用此函数
    UIMenuController *menu= [UIMenuController sharedMenuController];
    [menu update];
....
}

但有2点需要注意:

(1)必须先调用

[self becomeFirstResponder];

使其成为FirstResponder,否则在选择了select之后,虽然表面是textField并未失焦,但即使你调用了update函数第二个menu也不会自动出现,只有再次点击此textField时第二个menu才会出来。所以,在update之前要先调用一次becomeFirstResponder。


(2)update函数调用之后,canPerformAction函数会再次调用,因此为了保证显示的menu正确,需要在canPerformAction函数里写好逻辑。