【问题标题】:How to Remove UIMenuController Default Items In Swift如何在 Swift 中删除 UIMenuController 默认项
【发布时间】:2018-01-20 16:55:21
【问题描述】:

我正在尝试从 UIMenuController 中删除项目 Look UpShare...。我将如何专门删除这两个并保留我的自定义一个。这是我到目前为止所取得的成就:

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: "My Button", action: #selector(myButtonSel))
        UIMenuController.shared.menuItems = [menuItem1]

    }

这是我拥有的 canPerformAction:

  override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {

        //let shareSelector: Selector = NSSelectorFromString("_share:")

        if webView?.superview != nil {
            if action == #selector(myButtonSel){
                return true
            }
        }

        return super.canPerformAction(action, withSender: sender)
    }

还有一些奇怪的原因,当我尝试删除所有默认项并只保留我的自定义项时,它不起作用。这是我为此尝试的代码:

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {

    //let shareSelector: Selector = NSSelectorFromString("_share:")

    if webView?.superview != nil {
        if action == #selector(myButtonSel){
            return true
        }
        else {

            return false
        }
    }

    return super.canPerformAction(action, withSender: sender)
}

即使我尝试删除所有其他项目并保留我的习惯,我也无法这样做。我所能做的就是添加我的自定义项目。

【问题讨论】:

  • 您是否收到 SIGBART 错误?在这种情况下,请检查右侧菜单中的“连接检查器”选项卡?如果您看到一些您从故事板或代码中删除的名称,但它们仍然存在 - 您应该从 Connections Inspector 中删除主题。
  • @KuboAndTwoStrings 不,我没有收到任何错误,我的自定义菜单有效,但我似乎无法删除 UIMenuController 项目。每当我尝试删除它们时,代码都会被忽略。

标签: ios swift uimenucontroller uimenuitem


【解决方案1】:

我试过这个,但它通过子类化 WebView 并覆盖 canPerformAction 方法对我有用,在其中我手动删除了默认选项。

override func canPerformAction(_ action: Selector, withSender sender: AnyObject?) -> Bool {
    if action == #selector(cut(_:)) {
      return false
    }
    if action == #selector(paste(_:)) {
      return false
    }
    if action == #selector(select(_:)) {
      return false
    }
    if action == #selector(selectAll(_:)) {
      return false
    }
    ...

    return super.canPerformAction(action, withSender: sender)
  }

我提到了 Ike10this 答案,它对我有用。试一试。

【讨论】:

  • 有没有其他方法不被拒绝,因为文档:developer.apple.com/documentation/uikit/uiwebview 在底部,它说 UIWebView 不应该被子类化。
  • 另外,如何检查选定的文本。这不起作用:webViewHere.stringByEvaluatingJavaScript(from: "window.getSelection().toString();"
  • 好的,经过一番研究,我发现继承 UIWebView 并不违反政策。另外,我只是使用 NSNotification 从 ViewController 调用一个函数。
  • 是的,我想子类化是其他 ui 元素的方式,例如 uitextview、uitextfield 等。你每天都会学到新东西。再次感谢!
猜你喜欢
  • 2013-04-14
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多