サーガル、
あなたの質問は数か月前のものですが、私は最終的にこれを理解したので、他の誰かを助ける場合に備えて答えようと思いました.
次のコードを、webview を含むビュー コントローラーの viewDidAppear: メソッドに追加しました。
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
UIMenuItem *customMenuItem1 = [[[UIMenuItem alloc] initWithTitle:@"Custom 1" action:@selector(customAction1:)] autorelease];
UIMenuItem *customMenuItem2 = [[[UIMenuItem alloc] initWithTitle:@"Custom 2" action:@selector(customAction2:)] autorelease];
[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:customMenuItem1, customMenuItem2, nil]];
}
私の viewDidDisappear: では、これらのアイテムを削除します。
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[[UIMenuController sharedMenuController] setMenuItems:nil];
}
次に、ビュー コントローラーに canPerformAction:withSender: メソッドを実装しました。ここで何が起こっているのかを理解するには、レスポンダーとレスポンダー チェーンの概念を理解することが役立ちます。基本的に、uiviewcontroller はレスポンダー チェーンの一部であるため、レスポンダー チェーンの上位にあるオブジェクト (UIWebView など) が処理方法を知らないアクション (上記で追加したカスタム アクションなど) を処理できるかどうかを尋ねられます (詳細については、UIResponder のドキュメントとiOS のイベント処理ガイドを参照してください)。
これで、webview に対して canPerformAction:withSender: が呼び出されると、sender パラメーターが nil に設定されます。そのため、この関数の書き方について少し賢くしようとしています。基本的に、送信者がゼロであること、ユーザーに webview を表示していること、およびページ上の他のコントロールがファーストレスポンダーでないことを確認します。その場合は、これが上で定義したアクションの 1 つであるかどうかを確認し、そうであれば YES を返します。それ以外の場合はすべて、スーパーで同じメソッドを呼び出して UIViewController からデフォルト値を返します。
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (webView.superview != nil && ![urlTextField isFirstResponder]) {
if (action == @selector(customAction1:) || action == @selector(customAction2:)) {
return YES;
}
}
return [super canPerformAction:action withSender:sender];
}
もちろん、次のステップは、選択内容を実際に処理する方法を見つけることです (おそらく、Web ビューで JavaScript を実行することによって)。