访问菜单项以禁用/启用

时间:2019-02-25 20:59:02

标签: swift xcode macos nsmenuitem

我想实现NSMenuItem来触发某些功能(例如“运行计算”)。如何根据应用程序逻辑访问菜单项以启用/禁用菜单项?例如。文本的“剪切”功能仅在选择测试时才作为菜单项启用。仅在给出某些条件时才应启用“运行计算”。 谢谢!

enter image description here

2 个答案:

答案 0 :(得分:3)

您可能有一些实现runCalculation的视图控制器或窗口控制器,如下所示:

class ViewController: NSViewController {

    @IBAction func runCalculation(_ sender: Any?) {
        print(1 + 1)
    }

}

您已将“运行计算”菜单项的操作连接到控制器的runCalculation方法。

要启用和禁用菜单项,请按照下列步骤操作:

  1. 确保“计算器”菜单本身(类型为NSMenu)具有在IB中启用的“自动启用项目”属性,或者在代码中将autoenablesItems设置为true。 / p>

    menu auto enables items checkbox

  2. 使您的控制器符合NSUserInterfaceValidations协议:

    extension ViewController: NSUserInterfaceValidations {
        func validateUserInterfaceItem(_ item: NSValidatedUserInterfaceItem) -> Bool {
            // See step 3...
            return true
        }
    }
    
  3. validateUserInterfaceItem中,检查项目的action是否为runCalculation(_:)。如果是这样,则当且仅当您要允许用户运行计算时,才返回true:

    extension ViewController: NSUserInterfaceValidations {
        func validateUserInterfaceItem(_ item: NSValidatedUserInterfaceItem) -> Bool {
            switch item.action {
    
            case #selector(runCalculation(_:))?:
                // Put your real test here.
                return !textField.stringValue.isEmpty
    
            default: return true
            }
        }
    }
    

答案 1 :(得分:1)

例如,采用NSMenuItemValidation并实现委托方法validateMenuItem(_:)

func validateMenuItem(_ menuItem: NSMenuItem) -> Bool
{
   if menuItem.title == "Run Calculation" {
      // add the logic and `return true` if the menu item should be enabled otherwise `return false`
   }
   return true
}