2016-01-22 5 views
1

У меня есть панель навигации с элементом кнопки на панели справа. Я бы хотел открыть всплывающее меню при нажатии этой кнопки.Показать UIMenuController от 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) 
} 
+0

осуществляете ли вы '' canPerformAction и методы 'canBecomeFirstResponder'? – azimov

+0

Только: canBecomeFirstResponder. Он возвращает «true». Что-нибудь еще нужно? – bashan

+0

yes, '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:) включает пользовательские команды в пользовательском интерфейсе, а 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 позволяет popovers на iPhone и iPad с iOS 8. –

 Смежные вопросы

  • Нет связанных вопросов^_^