2012-09-30 66 views
3

在UIWebView中,我想要某個類div元素僅顯示一個自定義上下文菜單項。所以,我實現在一個UIWebView委託canPerformAction ::方法是這樣的: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,大多數的菜單項不顯示(剪切:副本:過去: ...)但選擇:並選擇所有:仍然顯示(與myAction一起)。在調試器下,我注意到這兩個select/selectAll方法不會在代理中觸發canPerformAction :: ...這兩個方法在哪裏被觸發?

+0

簽出這個答案(由我)處理類似的問題在iOS7上:[disable-long-press-menu-in-text-area-input-uiwebview](http://stackoverflow.com/questions/25263687/disable-long-press-menu-in-text-area-input-uiwebview) –

回答

0

有時,當應用程序使用iPad設備上,而不會連接到Xcode中,菜單正確顯示只有授權的項目,有時則不能......很奇怪的行爲確實

1

我想我知道爲什麼你可能有問題。

我有同樣的問題,類似的無奈:

「爲什麼選擇:與全選:通過調用canPerformAction ::步進時沒有出現?」

然後我意識到顯示UIMenuController時的firstResponder只是一個容器,而且這個類有一個實際上擴展了UITextView類的成員。由於sharedMenuController與Responder鏈中的第一個響應者進行交互,因此在容器中實現canPerformAction可以省略select和selectAll,因爲它們已經由textView成員(在這種情況下爲REAL firstResponder)處理。

您應該做的是在顯示UIMenuController時查找哪個對象是您的firstResponder,找到它可能擁有的任何響應對象,直到您找到堆棧中最高的響應者並在那裏實現canPerformAction。

祝你好運!

+0

我在iOS7上測試過,這是'Real'firstResponder的webview是UIWebView的子視圖,名爲UIWebBrowserView。 –