2016-01-22 68 views
1

我有一個導航欄,右邊有一個欄按鈕項目。我想在按下該按鈕時打開一個彈出式菜單。從UIBarButtonItem顯示UIMenuController

誰能告訴爲什麼這不起作用:

@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) 
} 
+0

讓你實現 'canPerformAction' 和 'canBecomeFirstResponder' 的方法呢? – azimov

+0

僅限:canBecomeFirstResponder。它返回「真」。還有什麼需要? – bashan

+0

是的,'canPerformAction'也必須實現,所以所有的菜單項將可見 – azimov

回答

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 
} 
+0

工作良好,但菜單覆蓋導航欄。任何將物品從上到下的方向放在物品下方的方法? – bashan

+0

我不確定是否可以垂直堆疊物品。要將菜單放在較低的位置,可以使用該框架並添加一個小的y偏移量。你可能想要考慮完全使用不同的類。 UIAlertController允許從iOS 8開始在iPhone和iPad上彈出。 –