从 UIBarButtonItem 显示 UIMenuController

Posted

技术标签:

【中文标题】从 UIBarButtonItem 显示 UIMenuController【英文标题】:Show UIMenuController from UIBarButtonItem 【发布时间】:2016-01-22 20:23:15 【问题描述】:

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

谁能说出为什么这不起作用:

@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)

【问题讨论】:

你实现了 'canPerformAction' 和 'canBecomeFirstResponder' 方法吗? 仅限:canBecomeFirstResponder。它返回“真”。还需要什么吗? 是的,'canPerformAction' 也必须实现,以便所有菜单项都可见 我应该只返回“true”吗? 【参考方案1】:

我认为您的 targetRect 未按预期运行。我假设您的目标是从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

【讨论】:

效果很好,但菜单覆盖了导航栏。有什么方法可以将项目从上到下方向并将菜单放在项目下方? 我不确定是否可以垂直堆叠项目。要将菜单放置在较低的位置,您可以使用框架并添加一个小的 y 偏移量。您可能要考虑完全使用不同的类。自 ios 8 起,UIAlertController 允许在 iPhone 和 iPad 上使用弹出框。

以上是关于从 UIBarButtonItem 显示 UIMenuController的主要内容,如果未能解决你的问题,请参考以下文章

带有图像的 UIBarButtonItem 不显示

如何在 Swift 中更改 UIBarButtonItem 的 tintColor?

为啥 UIBarButtonItem 显示为禁用? [复制]

UIBarButtonItem 没有出现在 UIToolbar Swift 上

添加到情节提要的 UIBarButtonItem 在运行时不会出现

UIBarButtonItem 图像未显示,但显示为红色方块