在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 ::这两个方法在哪里被触发?
答案 0 :(得分:1)
我想我知道你为什么会遇到问题。
我有同样的问题和类似的挫折:
“为什么选择:和selectAll:在逐步调用canPerformAction ::?时不显示”
然后我意识到显示UIMenuController时的firstResponder只是一个容器,并且该类有一个实际扩展UITextView类的成员。由于sharedMenuController与Responder链中的第一个响应者交互,因此在容器中实现canPerformAction会跳过select和selectAll,因为它们已经由textView成员(在这种情况下为REAL firstResponder)处理。
你应该做的是在显示UIMenuController时找到哪个对象是你的firstResponder,找到它可能拥有的任何响应者对象,直到你找到堆栈中的最高响应者,并在那里实现canPerformAction。
祝你好运!
答案 1 :(得分:0)
有时,当在iPad设备上使用应用程序时,如果没有与Xcode的连接,则菜单只能正确显示授权项目......有时候不是......非常不稳定的行为确实