相关控制器中的 NSToolbarItem 验证
NSToolbarItem validation in relevant controller
我有一个 NSToolbarItem,其视图为 NSButton,主菜单中有一个 NSMenuItem。两者都有相同的动作,发送给第一响应者,而不是特定目标。该方法最终在 NSSplitViewController 的子类中实现,位于 window 的内容视图的视图层次结构中的某处。我想验证这两个项目,但让特定的拆分视图控制器负责验证,因为它依赖于该控制器本地的某些条件。
我在该拆分视图控制器中覆盖了 validateToolbarItem(_:)
和 validateMenuItem(_:)
。对于菜单项,这按预期工作。调用该方法并进行验证。然而,validateToolbarItem(_:)
从未被调用。
根据 Apple’s documentation,NSToolbar 不会发送 validateToolbarItem(_:)
到基于视图的工具栏项。为了对此进行测试,我用图像工具栏项替换了工具栏项,它按预期工作。
基于此,我遇到了几种解决方案,但都不是我想要的。
子类 NSToolbarItem 并覆盖 validate()
。但是,没有关于我最终如何让控制器的 validateToolbarItem(_:)
调用的指导。
继承 NSToolbar 并覆盖 validateVisibleToolbarItems()
,然后将消息发送给第一响应者。这里我 运行 遇到了问题,我无法向拆分视图控制器发送消息,因为它在工具栏的响应链之外。
如上所述子类化 NSToolbar,但在响应链中的控制器中实现 validateToolbarItem(_:)
,例如 NSWindowController。这可行,但我必须添加额外的代码来处理菜单项不需要的内容。
有没有像图像工具栏项和菜单项一样有效的优雅解决方案?
我在我的 NSToolbarItem 按钮子类中编写了以下代码。使用此 toolbarItem 子类,您可以使用普通 validateUserInterfaceItem()
或 validateToolbarItem()
来验证包含 NSControl 的工具栏项。
override func validate() {
// validate content view
if
let control = self.view as? NSControl,
let action = self.action,
let validator = NSApp.target(forAction: action, to: self.target, from: self) as AnyObject?
{
switch validator {
case let validator as NSUserInterfaceValidations:
control.isEnabled = validator.validateUserInterfaceItem(self)
default:
control.isEnabled = validator.validateToolbarItem(self)
}
} else {
super.validate()
}
}
我有一个 NSToolbarItem,其视图为 NSButton,主菜单中有一个 NSMenuItem。两者都有相同的动作,发送给第一响应者,而不是特定目标。该方法最终在 NSSplitViewController 的子类中实现,位于 window 的内容视图的视图层次结构中的某处。我想验证这两个项目,但让特定的拆分视图控制器负责验证,因为它依赖于该控制器本地的某些条件。
我在该拆分视图控制器中覆盖了 validateToolbarItem(_:)
和 validateMenuItem(_:)
。对于菜单项,这按预期工作。调用该方法并进行验证。然而,validateToolbarItem(_:)
从未被调用。
根据 Apple’s documentation,NSToolbar 不会发送 validateToolbarItem(_:)
到基于视图的工具栏项。为了对此进行测试,我用图像工具栏项替换了工具栏项,它按预期工作。
基于此,我遇到了几种解决方案,但都不是我想要的。
子类 NSToolbarItem 并覆盖
validate()
。但是,没有关于我最终如何让控制器的validateToolbarItem(_:)
调用的指导。继承 NSToolbar 并覆盖
validateVisibleToolbarItems()
,然后将消息发送给第一响应者。这里我 运行 遇到了问题,我无法向拆分视图控制器发送消息,因为它在工具栏的响应链之外。如上所述子类化 NSToolbar,但在响应链中的控制器中实现
validateToolbarItem(_:)
,例如 NSWindowController。这可行,但我必须添加额外的代码来处理菜单项不需要的内容。
有没有像图像工具栏项和菜单项一样有效的优雅解决方案?
我在我的 NSToolbarItem 按钮子类中编写了以下代码。使用此 toolbarItem 子类,您可以使用普通 validateUserInterfaceItem()
或 validateToolbarItem()
来验证包含 NSControl 的工具栏项。
override func validate() {
// validate content view
if
let control = self.view as? NSControl,
let action = self.action,
let validator = NSApp.target(forAction: action, to: self.target, from: self) as AnyObject?
{
switch validator {
case let validator as NSUserInterfaceValidations:
control.isEnabled = validator.validateUserInterfaceItem(self)
default:
control.isEnabled = validator.validateToolbarItem(self)
}
} else {
super.validate()
}
}