从 UIBarButtonItem 显示 UIMenuController

Show UIMenuController from UIBarButtonItem

我有一个导航栏,右侧有一个栏按钮项。我想在按下该按钮时打开一个弹出菜单。

谁能告诉我为什么这不起作用:

@IBAction func quickJumpClicked() {

    let menu = UIMenuController.sharedMenuController()
    menu.menuItems =
        [UIMenuItem(title: "Test me", action: Selector("deleteLine")),
        UIMenuItem(title: "Test me", action: Selector("deleteLine")),
        UIMenuItem(title: "Test me", action: Selector("deleteLine"))]
    menu.setTargetRect(self.navigationController!.toolbar.subviews[1].frame, inView: self.view.superview!)

    becomeFirstResponder()
    menu.setMenuVisible(true, animated: true)
}

我认为您的 targetRect 未按预期运行。我假设您的 objective 是从 UIBarButtonItem.

中获取一个菜单

你可以做的一件事是重写你的 IBAction 以包含发件人,然后只获取发件人的框架 - 在你的情况下,UIBarButtonItem

看起来像这样:

@IBAction func quickJumpClicked(sender: AnyObject) {
    let menu = UIMenuController.sharedMenuController()
    menu.menuItems =
        [UIMenuItem(title: "Test me", action: Selector("deleteLine")),
            UIMenuItem(title: "Test me", action: Selector("deleteLine")),
            UIMenuItem(title: "Test me", action: Selector("deleteLine"))]
    menu.setTargetRect(sender.view!!.frame, inView: self.view)
    menu.setMenuVisible(true, animated: true)
    becomeFirstResponder()
}

您可能还缺少两种方法。 canPerformAction(_:withSender:) 在 UI 中启用自定义命令,并且 canBecomeFirstResponder() 允许您的控制器成为第一响应者并接收来自 UIMenuController 的消息。

例如:

override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
    if action == Selector("deleteLine") {
        return true
    }
    return false
}

override func canBecomeFirstResponder() -> Bool {
    return true
}