相关控制器中的 NSToolbarItem 验证

NSToolbarItem validation in relevant controller

我有一个 NSToolbarItem,其视图为 NSButton,主菜单中有一个 NSMenuItem。两者都有相同的动作,发送给第一响应者,而不是特定目标。该方法最终在 NSSplitViewController 的子类中实现,位于 window 的内容视图的视图层次结构中的某处。我想验证这两个项目,但让特定的拆分视图控制器负责验证,因为它依赖于该控制器本地的某些条件。

我在该拆分视图控制器中覆盖了 validateToolbarItem(_:)validateMenuItem(_:)。对于菜单项,这按预期工作。调用该方法并进行验证。然而,validateToolbarItem(_:) 从未被调用。

根据 Apple’s documentation,NSToolbar 不会发送 validateToolbarItem(_:) 到基于视图的工具栏项。为了对此进行测试,我用图像工具栏项替换了工具栏项,它按预期工作。

基于此,我遇到了几种解决方案,但都不是我想要的。

有没有像图像工具栏项和菜单项一样有效的优雅解决方案?

我在我的 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()
    }
}