我有一个带有nsbutton的nstoolbaritem作为其视图,主菜单中的nsmenuitem。两者都有相同的操作,该操作已发送给第一响应者,而不是针对特定目标。该方法最终在窗口内容视图的视图层次结构中的某个位置在NSSPlitViewController的子类中实现。我想验证这两个项目,但是要有特定的分景控制器照顾验证,因为它依赖于该控制器本地的某些条件。
i在该拆分视图控制器中叠加validateToolbarItem(_:)
和validateMenuItem(_:)
。对于菜单项,这是按预期工作的。该方法被调用并进行验证。validateToolbarItem(_:)
从未被调用。
根据Apple的文档,Nstoolbar不会将validateToolbarItem(_:)
发送到基于基于的工具栏项目。为了测试这一点,我用图像工具栏项目替换了工具栏项目,并且可以按预期工作。
基于此,我遇到了几种解决方案,但它们不是我想要的。
-
子类NstoolBariTem和覆盖
validate()
。但是,没有指导我最终如何将控制器的validateToolbarItem(_:)
致电。 -
子类Nstoolbar和覆盖
validateVisibleToolbarItems()
,然后将消息发送给第一响应者。在这里,我遇到了这个问题,我无法将消息发送给拆分视图控制器,因为它不在工具栏的响应链中。 -
上面的子类Nstoolbar,但在响应链中的控制器中实现
validateToolbarItem(_:)
,例如NSWINDOWCONTROLLER。这将起作用,但是然后我必须添加其他代码来处理菜单项不需要的内容。
是否有一个优雅的解决方案,就像图像工具栏项目和菜单项一样可行?
我在按钮的nstoolbaritem子类中编写了以下代码。使用此工具栏子类,您可以使用普通的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()
}
}