【问题标题】:showing custom menu on selection in UIWebView in iphone在 iphone 的 UIWebView 中显示自定义菜单
【发布时间】:2011-02-26 16:11:53
【问题描述】:

当用户在 UIWebView 上完成选择时,我想显示 2 个选项,例如“hi”和“bye”。

我已将观察者添加到我的视图控制器中,如下所示。但我不知道进一步的实现。

[[UIMenuController sharedMenuController] addObserver:self 
                                          forKeyPath:UIMenuControllerWillShowMenuNotification
                                             options:nil
                                             context:nil
 ];

【问题讨论】:

    标签: iphone objective-c xcode uiwebview uimenucontroller


    【解决方案1】:

    萨加尔,

    你的问题已经有几个月了,但我终于想通了,所以我想我会回答它以防它帮助别人。

    我将以下代码添加到包含 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]];
    }
    

    在我看来DidDisappear:,我继续删除这些项目:

    - (void)viewDidDisappear:(BOOL)animated {
        [super viewDidDisappear:animated];
    
        [[UIMenuController sharedMenuController] setMenuItems:nil];
    }
    

    然后,我在视图控制器中实现了 canPerformAction:withSender: 方法。它有助于理解响应者和响应者链的概念,以了解这里发生了什么。基本上,您的 uiviewcontroller 是响应者链的一部分,因此它会被询问是否可以处理响应者链上方的对象(如 UIWebView)不知道如何处理的任何操作(例如您在上面添加的自定义操作)(有关血腥细节,请参阅 UIResponder documentationEvent Handling Guide for 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)。

    【讨论】:

    【解决方案2】:

    迅速:

    class ViewController: UIViewController {
        override func viewDidAppear(animated: Bool) {
            super.viewDidAppear(animated)
    
            // add two custom menu items to the context menu of UIWebView (assuming in contenteditable mode)
            let menuItem1 = UIMenuItem(title: "Foo", action: #selector(ViewController.foo))
            let menuItem2 = UIMenuItem(title: "Bar", action: #selector(ViewController.bar))
            UIMenuController.sharedMenuController().menuItems = [menuItem1, menuItem2]
        }
    
        override func viewDidDisappear(animated: Bool) {
            super.viewDidAppear(animated)
            UIMenuController.sharedMenuController().menuItems = nil
        }
    
        override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
            if webView?.superview != nil {
                if action == #selector(ViewController.foo) || action == #selector(ViewController.bar) {
                    return true
                }
            }
    
            return super.canPerformAction(action, withSender: sender)
        }
    
        func foo() {
            print("foo")
        }
    
        func bar() {
            print("bar")
        }
    }
    

    注意:#selector 在 Swift 2.2 中可用。

    【讨论】:

      猜你喜欢
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多