UIMenuController对象拥有一组默认的UIMenuItem对象,专门负责为用户显示“编辑”菜单。以UITextField或UITextText为例,当用户按下上述两种对象时,UIMenuController对象就会显示这类UIMenuItem对象(例如剪切、拷贝和粘贴等)。这类UIMenuItem对象都有固定的动作消息。以剪切菜单项为例,当用户选中“剪切”项后,相应的UIMenuItem对象就会向显示该菜单项的UIView对象发送cut:消息。
如果某个UIResponder子类需要实现特定的“编辑”功能,就可以实现相应的方法。以UITextField为例,为了能够剪切当前选中的文字,UITextField实现了cut:方法。UIResponderStandardEditActions协议声明了所有这类“编辑”方法。
如果某个UIView子类实现了UIResponderStandardEditActions协议中的方法,那么当这个子类对象显示UIMenuController对象时,就会出现和这些方法相对应的菜单项。这是因为该对象会在显示前枚举所有的“编辑”菜单项,然后根据其动作消息向视图发送canPerformAction:withSender:消息。如果视图实现了指定的方法,该消息就会返回YES,否则返回NO。UIMenuController对象会根据canPerformAction:withSender:的返回结果判断是否应该显示相应的菜单项。
如果读者要实现某个UIResponderStandardEditActions协议中的方法,又不希望UIMenuController对象显示相应的菜单项,可以覆盖canPerformAction:withSender:,然后针对特定的方法返回NO,代码如下:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(copy:))
return NO;
// 父类的实现会根据目标对象是否实现了特定的动作方法,返回YES或NO
return [super canPerformAction:action withSender:sender];
}