在 UIWebView 中,我希望某个类 div 元素仅显示一个自定义上下文菜单条目。所以我在 UIWebView 委托(delegate)中实现了 canPerformAction::方法,如下所示:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (self.webView.superview != nil) {
BOOL isMyClass=[[self.webView stringByEvaluatingJavaScriptFromString:@"window.getSelection().getRangeAt(0).startContainer.parentNode.className;"] isEqualToString:@"myClass"];
if (isMyClass) {
if (action == @selector(myAction:)) {
return YES;
} else {
return NO; // should disable any other menu items
}
}
}
return [super canPerformAction:action withSender:sender];
}
结果很奇怪:当用户选择这样一个myclass div时,大多数menuItem都没有显示(cut:copy:past:...)但是select:和selectAll:仍然显示(连同myAction)。在调试器下,我注意到这两个 select/selectAll 方法不会在委托(delegate)中触发 canPerformAction::......这两个方法在哪里触发?
最佳答案
我想我知道您可能遇到问题的原因。
我有同样的问题和类似的挫败感:
“为什么 select: 和 selectAll: 在单步执行对 canPerformAction::的调用时不出现?”
然后我意识到显示 UIMenuController 时的 firstResponder 只是一个容器,并且这个类有一个成员实际上是在扩展 UITextView 类。由于 sharedMenuController 与 Responder 链中的第一响应者交互,因此在容器中实现 canPerformAction 会跳过 select 和 selectAll,因为它们已经由 textView 成员(在这种情况下为 REAL firstResponder)处理。
你应该做的是在显示 UIMenuController 时找到哪个对象是你的 firstResponder,找到它可能拥有的任何响应者对象,直到你找到堆栈中最高的响应者,并在那里实现 canPerformAction。
祝你好运!
关于ios - UIWebView canPerformAction 不禁用某些菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12664577/