启用或禁用可可应用程序中不同视图控制器上的菜单项?

时间:2018-12-26 08:14:32

标签: cocoa menu swift4

我有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 :(得分:0)

如果使用模式搜索,它将始终被激活。 为了启用/禁用依赖于呈现的视图控制器,我将向视图控制器添加一个操作以手动方式打开视图控制器作为模式。菜单项必须通过第一个响应者连接到动作(openModalViewController)。

@IBAction func openModalViewController(_ sender: AnyObject) {

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

考虑必须至少有一个视图能够使main / 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
    }
}