3

在 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:: ... 这两个方法在哪里触发?

4

2 回答 2

1

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

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

“为什么 select: 和 selectAll: 在单步执行对 canPerformAction:: 的调用时没有出现?”

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

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

祝你好运!

于 2013-07-11T19:55:23.660 回答
0

Sometimes, when application is used on the iPad device, with no connection to Xcode, the menu correctly displays only the authorized item... Sometimes not... Very erratic behaviour indeed

于 2012-10-01T11:30:07.923 回答