UIKit框架的UITextField、UITextView和UIWebView是默认支持拷贝-剪切-黏贴这类功能(UIMenuController),但有时我们需要禁用这类功能,就比如我现在做的项目。要禁用此类功能很简单,主要有2步(以UITextField为例):
(1)定义UITextField子类CustomTextField
(2)在CustomTextField中重写函数:
- (BOOL)canPerformAction:(SEL)actionwithSender:(id)sender{ return NO;}
返回值为NO,标识禁用所有的action(Cut、Copy、Paste等)。
这样一来,只需要在项目中使用CustomTextField即可。
注意:如果不定义UITextField的子类,可以通过Category为UITextField重写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函数里写好逻辑。