UIWebView canPerformAction不会禁用某些菜单项

时间:2012-09-30 19:57:01

标签: ios uiwebview contextmenu

在UIWebView中,我希望某个类div元素只显示一个自定义上下文菜单项。所以我在UIWebView委托中实现了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:...)但是选择:和selectAll:仍然显示(以及myAction)。在调试器下,我注意到这两个select / selectAll方法没有触发委托中的canPerformAction ::这两个方法在哪里被触发?

2 个答案:

答案 0 :(得分:1)

我想我知道你为什么会遇到问题。

我有同样的问题和类似的挫折:

“为什么选择:和selectAll:在逐步调用canPerformAction ::?时不显示”

然后我意识到显示UIMenuController时的firstResponder只是一个容器,并且该类有一个实际扩展UITextView类的成员。由于sharedMenuController与Responder链中的第一个响应者交互,因此在容器中实现canPerformAction会跳过select和selectAll,因为它们已经由textView成员(在这种情况下为REAL firstResponder)处理。

你应该做的是在显示UIMenuController时找到哪个对象是你的firstResponder,找到它可能拥有的任何响应者对象,直到你找到堆栈中的最高响应者,并在那里实现canPerformAction。

祝你好运!

答案 1 :(得分:0)

有时,当在iPad设备上使用应用程序时,如果没有与Xcode的连接,则菜单只能正确显示授权项目......有时候不是......非常不稳定的行为确实