我正在构建自己的自定义编辑菜单(UIMenuController),并使用典型的
-(BOOL)canPerformAction:(SEL)action withSender(id)sender
方法有条件地启用/禁用系统默认值。典型的编辑方法有很好的文档(copy:, cut:等),但我找不到任何关于"Define"菜单选项在iOS 5中调用什么方法来调出新词字典的信息。也许它就藏在眼前,但我花了好几个小时找它,所以我很感激你的帮助。具体来说,我需要:
if (action == @selector(defineWord:)) ......
但是告诉我"defineWord:"到底是什么
ps -我不介意知道什么类的方法属于,只是出于好奇(复制:属于UIResponderStandardEditActions,例如)
通过实现这个:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
NSLog(@"%@", NSStringFromSelector(action));
}
我可以看到选择器是"_define:"
定义选择器(_define:)实际上是私有的,如果你使用它,你的应用将被拒绝。我需要做的是让定义菜单项只显示在UITextView中:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(cut:) ||
action == @selector(copy:) ||
action == @selector(select:) ||
action == @selector(selectAll:) ||
action == @selector(paste:) ||
action == @selector(delete:))
{
return NO;
}
else return [super canPerformAction:action withSender:sender];
}
在iOS 7.1中,我看到当在UIWebView
的子类上重写canPerformAction:withSender:
方法时发生这些动作:
cut:
copy:
select:
selectAll:
paste:
delete:
_promptForReplace:
_showTextStyleOptions:
_define:
_addShortcut:
_accessibilitySpeak:
_accessibilitySpeakLanguageSelection:
_accessibilityPauseSpeaking:
makeTextWritingDirectionRightToLeft:
makeTextWritingDirectionLeftToRight:
假设前缀为下划线的是"私有API",其使用将使您的应用程序被app Store拒绝。但是我真的找不到任何这样或那样的文档。
没有下划线的定义为UIResponderStandardEditActions
非正式协议的一部分。
不使用privateAPI的简单方法,只对想要的操作返回YES
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(MySelector:)
{
return [super canPerformAction:action withSender:sender]
}
else
return NO;
}
享受;)