Ios UIWebView canPerformAction不禁用某些菜单项

Ios UIWebView canPerformAction不禁用某些菜单项,ios,uiwebview,contextmenu,Ios,Uiwebview,Contextmenu,在UIWebView中,我希望某个类div元素只显示一个自定义上下文菜单项。因此,我在UIWebView委托中实现了canPerformAction::方法,如下所示: - (BOOL)canPerformAction:(SEL)action withSender:(id)sender { if (self.webView.superview != nil) { BOOL isMyClass=[[self.webView stringByEvaluatingJavaScriptF

在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时,大多数菜单项都不会显示(cut:copy:pass:…),但select:和selectAll:仍会显示(以及myAction)。在debugger下,我注意到这两个select/selectAll方法不会在委托中激发canPerformAction::命令。。。这两种方法在哪里触发?

有时,当应用程序在iPad设备上使用时,没有连接到Xcode,菜单仅正确显示授权项。。。有时不是。。。非常不稳定的行为确实

我想我知道你为什么会有问题

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

“单步调用canPerformAction::”时,为什么select:和selectAll:不出现?”

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

您应该做的是在显示UIMenuController时找到哪个对象是您的第一个响应程序,找到它可能拥有的任何响应程序对象,直到找到堆栈上最高的响应程序,并在那里实现CanPerformance


祝你好运

我在iOS7上进行了测试,webview是“真正的”第一响应者,它是UIWebView的子视图,名为UIWebBrowserView。请(由我)在iOS7上查看此答案以处理类似问题: