访问 Disable/Enable 的菜单项
Access Menu Item to Disable/Enable
我想实现 NSMenuItem
以触发某些功能(例如 "Run Calculation")。如何访问菜单项以便 enable/disable 基于应用程序逻辑的项目?例如。文本的 "cut" 功能仅在选择测试时作为菜单项启用。 "Run Calculation" 只应在满足特定条件时启用。
谢谢!
您可能有一些视图控制器或 window 控制器实现了 runCalculation
,像这样:
class ViewController: NSViewController {
@IBAction func runCalculation(_ sender: Any?) {
print(1 + 1)
}
}
并且您已将“运行 计算”菜单项的操作连接到控制器的 runCalculation
方法。
要启用和禁用菜单项,请按照下列步骤操作:
确保“计算器”菜单本身(NSMenu
类型)在 IB 中打开了“自动启用项目”属性,或者 autoenablesItems
在代码中设置为 true。
使您的控制器符合 NSUserInterfaceValidations
协议:
extension ViewController: NSUserInterfaceValidations {
func validateUserInterfaceItem(_ item: NSValidatedUserInterfaceItem) -> Bool {
// See step 3...
return true
}
}
在validateUserInterfaceItem
中,检查项目的action
是否为runCalculation(_:)
。如果是这样,当且仅当您希望允许用户 运行 计算时 return 为真:
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
}
}
}
我想实现 NSMenuItem
以触发某些功能(例如 "Run Calculation")。如何访问菜单项以便 enable/disable 基于应用程序逻辑的项目?例如。文本的 "cut" 功能仅在选择测试时作为菜单项启用。 "Run Calculation" 只应在满足特定条件时启用。
谢谢!
您可能有一些视图控制器或 window 控制器实现了 runCalculation
,像这样:
class ViewController: NSViewController {
@IBAction func runCalculation(_ sender: Any?) {
print(1 + 1)
}
}
并且您已将“运行 计算”菜单项的操作连接到控制器的 runCalculation
方法。
要启用和禁用菜单项,请按照下列步骤操作:
确保“计算器”菜单本身(
NSMenu
类型)在 IB 中打开了“自动启用项目”属性,或者autoenablesItems
在代码中设置为 true。使您的控制器符合
NSUserInterfaceValidations
协议:extension ViewController: NSUserInterfaceValidations { func validateUserInterfaceItem(_ item: NSValidatedUserInterfaceItem) -> Bool { // See step 3... return true } }
在
validateUserInterfaceItem
中,检查项目的action
是否为runCalculation(_:)
。如果是这样,当且仅当您希望允许用户 运行 计算时 return 为真: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 } } }