Включить или отключить пункты меню на разных контроллерах представления в приложении какао? - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть 3 контроллера вида, скажем main1, main2 и child.Я добавил пункт меню, по щелчку которого он должен открыть дочерний контроллер вида как модальный.Всякий раз, когда пользователь находится в main1 VC, пункт меню должен быть включен.Если пользователь в main2 VC, меню должно быть отключено.Прямо сейчас я добавил модальный переход между пунктом меню и дочерним VC.Я использовал следующие подходы для отключения, но они не работают.

Метод 1: В main2 VC я добавил

 func validateUserInterfaceItem(_ anItem: NSValidatedUserInterfaceItem) -> Bool {
      return false
 }

 override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
      return false
 }

Метод 2:

 override func viewDidLoad() {
      super.viewDidLoad()
      let mainMenu = NSApplication.shared().mainMenu!
      let appMenu = mainMenu.item(at: 0)!.submenu
      appMenu?.item(withTitle: someMenuTitle)?.isEnabled = false
 }

1 Ответ

0 голосов
/ 26 декабря 2018

Если вы используете модальный переход, он всегда будет активирован.Чтобы включить / отключить в зависимости от представленного контроллера представления, я бы добавил действие в контроллер представления, чтобы вручную открыть контроллер представления как модальный.Элемент меню должен быть подключен к действию (openModalViewController) с первым респондентом.

@IBAction func openModalViewController(_ sender: AnyObject) {

    let storyboard = NSStoryboard(name: "Main", bundle: nil)
    let viewController = storyboard.instantiateController(withIdentifier: "MyViewController") as! NSViewController
    presentAsModalWindow(viewController)
}

Учтите, что должен быть хотя бы один просмотр, способный получить первого респондента в main1 / main2, что пункт меню будетактивировать.Если это не так, вам придется реализовать acceptsFirstResponder для соответствующего представления.

override var acceptsFirstResponder: Bool{
    return true
}

Для реализации validateUserInterfaceItem в этом случае не потребуется, только если вы хотите контролировать активацию / деактивациюзависит от дополнительного состояния, как в примере ниже.

extension ViewController: NSMenuItemValidation {

    func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {

        if menuItem.action == #selector(delete(_:)) {
            return tableView.selectedRow < 0 ? false : true
        }

        return true
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...