3

UIWebView で、特定のクラス div 要素にカスタム コンテキスト メニュー エントリを 1 つだけ表示させたいと考えています。そのため、次のように 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 とともに)。デバッガーの下で、これら 2 つの select/selectAll メソッドがデリゲートで canPerformAction:: を起動しないことに気付きました...これら 2 つのメソッドはどこで起動されますか?

4

2 に答える 2

1

なぜあなたが問題を抱えているのか、私は知っていると思います。

私は同じ質問と同様の欲求不満を持っていました:

「canPerformAction:: への呼び出しをステップ実行するときに、select: と selectAll: が表示されないのはなぜですか?」

次に、UIMenuController を表示するときの firstResponder は単なるコンテナーであり、このクラスには実際に UITextView クラスを拡張するメンバーがあることに気付きました。sharedMenuController はレスポンダー チェーンの最初のレスポンダーとやり取りするため、コンテナーに canPerformAction を実装すると、select と selectAll がスキップされます。

あなたがすべきことは、UIMenuController を表示するときにどのオブジェクトが firstResponder であるかを見つけ、スタックで最高のレスポンダーを見つけるまでそれが所有する可能性のあるレスポンダー オブジェクトを見つけ、そこに canPerformAction を実装することです。

幸運を!

于 2013-07-11T19:55:23.660 に答える
0

アプリケーションが Xcode に接続されていない iPad デバイスで使用されている場合、メニューに許可されたアイテムのみが正しく表示されることがあります...

于 2012-10-01T11:30:07.923 に答える