相关控制器中的NstoolBariTem验证



我有一个带有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()
    }
}

相关内容

  • 没有找到相关文章

最新更新