相关控制器中的 NSToolbarItem 验证

2024-01-12

我有一个 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(使用前将#替换为@)

相关控制器中的 NSToolbarItem 验证 的相关文章

随机推荐