我有一个 NSToolbarItem,其视图为 NSButton,主菜单中有一个 NSMenuItem。两者具有相同的操作,该操作被发送到第一响应者,而不是特定目标。该方法最终在 NSSplitViewController 的子类中实现,位于窗口内容视图的视图层次结构中的某个位置。我想验证这两个项目,但让特定的分割视图控制器负责验证,因为它依赖于该控制器本地的某些条件。
我推翻了validateToolbarItem(_:)
and validateMenuItem(_:)
在那个分割视图控制器中。对于菜单项,这按预期工作。调用该方法并进行验证。validateToolbarItem(_:)
然而,从未被调用过。
根据苹果的文档 https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Toolbars/Tasks/ValidatingTBItems.html, NSToolbar 不发送validateToolbarItem(_:)
基于视图的工具栏项目。为了测试这一点,我用图像工具栏项替换了工具栏项,它按预期工作。
基于此,我找到了几种解决方案,但都不是我想要的。
子类 NSToolbarItem 并覆盖validate()
。但是,没有给出关于我最终如何获得控制器的指导validateToolbarItem(_:)
打电话。
子类 NSToolbar 并覆盖validateVisibleToolbarItems()
,然后将消息发送给第一响应者。在这里我遇到了问题,我无法向分割视图控制器发送消息,因为它位于工具栏的响应程序链之外。
子类 NSToolbar 如上,但实现validateToolbarItem(_:)
在响应者链内的控制器中,例如 NSWindowController。这可行,但随后我必须添加额外的代码来处理菜单项不需要的内容。
是否有一个优雅的解决方案,可以像图像工具栏项和菜单项一样工作?
我在按钮的 NSToolbarItem 子类中编写了以下代码。有了这个toolbarItem子类,你就可以使用普通的validateUserInterfaceItem()
or 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()
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)