UIWebView canPerformAction 不禁用某些菜单项
Posted
技术标签:
【中文标题】UIWebView canPerformAction 不禁用某些菜单项【英文标题】:UIWebView canPerformAction do not disable some menu items 【发布时间】:2012-09-30 19:57:01 【问题描述】:在 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时,大部分menuItems都没有显示出来(cut:copy:past:...)但是select:和selectAll:仍然显示出来了(和myAction一起)。在调试器下,我注意到这两个 select/selectAll 方法不会在委托中触发 canPerformAction::... 这两个方法在哪里触发?
【问题讨论】:
查看这个答案(由我)以处理 ios7 上的类似问题:disable-long-press-menu-in-text-area-input-uiwebview 【参考方案1】:我想我知道你为什么会遇到问题。
我有同样的问题和类似的挫败感:
“为什么 select: 和 selectAll: 在单步执行对 canPerformAction:: 的调用时没有出现?”
然后我意识到显示 UIMenuController 时的 firstResponder 只是一个容器,并且这个类有一个实际上是扩展 UITextView 类的成员。由于 sharedMenuController 与 Responder 链中的第一响应者交互,因此在容器中实现 canPerformAction 跳过了 select 和 selectAll,因为它们已经由 textView 成员(在这种情况下为 REAL firstResponder)处理。
你应该做的是在显示 UIMenuController 时找到哪个对象是你的 firstResponder,找到它可能拥有的任何响应者对象,直到找到堆栈中最高的响应者,然后在那里实现 canPerformAction。
祝你好运!
【讨论】:
我在 iOS7 上测试过,作为“真实”firstResponder 的 webview 是 UIWebView 的子视图,称为 UIWebBrowserView..【参考方案2】:有时,当在 iPad 设备上使用应用程序时,在没有连接到 Xcode 的情况下,菜单正确地只显示授权项......有时不是......确实非常不稳定的行为
【讨论】:
以上是关于UIWebView canPerformAction 不禁用某些菜单项的主要内容,如果未能解决你的问题,请参考以下文章
swift - UIWebView 和 WKWebView(iOS12 之后替换UIWebView)
调整 UIWebView 框架大小时如何禁用 UIWebView 调整内容大小
如何在 UIWebView 上显示覆盖而不阻止用户与 UIWebView 的交互