gpt4 book ai didi

cocoa - 相关 Controller 中的 NSToolbarItem 验证

转载 作者:行者123 更新时间:2023-12-03 16:08:38 25 4
gpt4 key购买 nike

我有一个 NSToolbarItem,其 View 为 NSButton,主菜单中有一个 NSMenuItem。两者具有相同的操作,该操作被发送到第一响应者,而不是特定目标。该方法最终在 NSSplitViewController 的子类中实现,位于窗口内容 View 的 View 层次结构中的某个位置。我想验证这两个项目,但让特定的分割 View Controller 负责验证,因为它依赖于该 Controller 本地的某些条件。

我在该分割 View Controller 中覆盖了 validateToolbarItem(_:)validateMenuItem(_:) 。对于菜单项,这按预期工作。调用该方法并进行验证。然而,validateToolbarItem(_:) 永远不会被调用。

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

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

  • 子类 NSToolbarItem 并重写 validate()。但是,没有给出关于如何最终调用 Controller 的 validateToolbarItem(_:) 的指导。

  • 子类化 NSToolbar 并重写 validateVisibleToolbarItems(),然后将消息发送给第一响应者。在这里我遇到了问题,我无法向分割 View Controller 发送消息,因为它位于工具栏的响应程序链之外。

  • 如上所述对 NSToolbar 进行子类化,但在响应者链内的 Controller (例如 NSWindowController)中实现 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()
}
}

关于cocoa - 相关 Controller 中的 NSToolbarItem 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42470645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com