萨加尔,
你的问题已经有几个月了,但我终于弄清楚了这个问题,所以我想我会回答它,以防它帮助别人。
我将以下代码添加到包含 web 视图的视图控制器的 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。所以,我试着对我如何编写这个函数有点聪明。基本上,我确保发送者为零,我向用户显示 web 视图,并且页面上的任何其他控件都不是第一响应者。如果是这种情况,那么我会检查这是否是我在上面定义的操作之一,如果是,则返回 YES。在所有其他情况下,我通过在 super 上调用相同的方法从 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)。