代码之家  ›  专栏  ›  技术社区  ›  sagarkothari

在iPhone的uiwebview中显示自定义菜单

  •  20
  • sagarkothari  · 技术社区  · 15 年前

    当用户在uiwebview上完成选择时,我想显示两个选项,如“嗨”和“再见”。

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

    [[UIMenuController sharedMenuController] addObserver:self 
                                              forKeyPath:UIMenuControllerWillShowMenuNotification
                                                 options:nil
                                                 context:nil
     ];
    
    2 回复  |  直到 7 年前
        1
  •  44
  •   Sophie Alpert    11 年前

    萨加尔

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

    我在viewdidAppear中添加了以下代码:包含WebView的视图控制器的方法。

    - (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]];
    }
    

    在我看来,不见了,我继续删除这些项目:

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

    然后,我在视图控制器中实现了canperformaction:withsender:method。它有助于理解响应者和响应者链的概念,以了解这里发生了什么。基本上,您的uiviewController是响应程序链的一部分,因此会询问它是否可以处理任何操作(如您在上面添加的自定义操作),这些操作的对象位于响应程序链的上方(如uiwebview)不知道如何处理(请参见 UIResponder documentation 以及 Event Handling Guide for iOS 获取血淋淋的细节)。

    现在,当为WebView调用canPerformation:WithSender:时,sender参数设置为nil。所以,我试着对如何编写这个函数有点了解。基本上,我确保发送者为零,我向用户显示WebView,页面上的任何其他控件都不是第一响应者。如果是这样的话,那么我检查一下这是否是我上面定义的操作之一,如果是的话,重新返回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];
    }
    

    当然,现在下一步是弄清楚如何对所选内容进行实际操作(可能通过在WebView中运行一些javascript)。

        2
  •  3
  •   parag    9 年前

    在斯威夫特:

    类viewController:uiviewController{
    覆盖func viewdid显示(动画:bool){
    超级视图显示(动画)
    
    //在uiWebView的上下文菜单中添加两个自定义菜单项(假定为ContentEditable模式)
    让menuitem1=uimenuitem(标题:“foo”,操作:选择器(viewcontroller.foo))
    让menuitem2=uimenuitem(标题:“bar”,操作:选择器(viewcontroller.bar))
    uimenuController.sharedmenuController().menuitems=[菜单项1,菜单项2]
    }
    
    覆盖func viewdid消失(动画:bool){
    超级视图显示(动画)
    uimenuController.sharedmenuController().menuitems=nil
    }
    
    重写func canperformation(操作:选择器,带有sender sender:anyobject?)& Bool
    如果是WebVIEW?超视点!= nIL{
    如果action==选择器(viewController.foo)action==选择器(viewController.bar){
    返回真
    }
    }
    
    返回super.canperformation(action,withsender:sender)
    }
    
    FUNC FULL(){
    打印(“FO”)
    }
    
    FUNC BAIR()
    打印()
    }
    }
    < /代码> 
    
    

    注意:选择器在Swift 2.2中可用。

    注:选择开关可在Swift 2.2中使用。

    screenshot