ios - UIWebView canPerformAction 不禁用某些菜单项

标签 ios uiwebview contextmenu

在 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/

相关文章:

iphone - 通过单击 UITableViewCell 将 UIWebView 推送到 UINavigationController 后未加载

c# - wpf listview右键问题

带有上下文菜单的 WPF 按钮

iOS/WatchKit : Is there a way for the watch kit app(swift) to use the iOS code (Objective C)?

html - 在 UIWebView 中从 HTML 获取特定元素

ios - Swift 中自动重新加载 map

iphone - 有没有办法允许 `webview-html` 与本地通知通信?

java - Eclipse 菜单管理器 : get ImageDescriptor of Image?

objective-c - 当焦点和键盘隐藏文本字段时滚动到文本字段

ios - 不同的颜色,即使 RGB 值相等