小编Eit*_*tot的帖子

将 NSToolbarItems 与 NSSplitView 列对齐

Finder 和 Notes 有一种我正在寻求重现的特殊行为。NSToolbar 中的“灵活空间”似乎考虑了拆分视图的尺寸。例如,第一组按钮在侧边栏的左侧与右侧对齐。第二组图标与第一列的右侧对齐。当我加宽侧边栏时,工具栏项目随之移动。

有没有可能重现这个?

在此处输入图片说明


解决方案

使用@KenThomases 提供的解决方案,我实现了如下:

final class MainWindowController: NSWindowController {
    override func windowDidLoad() {
        super.windowDidLoad()
        window?.toolbar?.delegate = self
        // Make sure that tracking is enabled when the toolbar is completed
        DispatchQueue.main.async {
            self.trackSplitViewForFirstFlexibleToolbarItem()
        }
    }
}

extension MainWindowController: NSToolbarDelegate {
    func toolbarWillAddItem(_ notification: Notification) {
        // Make sure that tracking is evaluated only after the item was added
        DispatchQueue.main.async {
            self.trackSplitViewForFirstFlexibleToolbarItem()
        }
    }

    func toolbarDidRemoveItem(_ notification: Notification) {
        trackSplitViewForFirstFlexibleToolbarItem()
    }

    /// - Warning: This is a …
Run Code Online (Sandbox Code Playgroud)

cocoa nssplitview nstoolbar nstoolbaritem nssplitviewcontroller

5
推荐指数
1
解决办法
1480
查看次数

相关控制器中的NSToolbarItem验证

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

我推翻validateToolbarItem(_:)validateMenuItem(_:)在该分割视图控制器。对于菜单项,它按预期工作。调用该方法,然后进行验证。validateToolbarItem(_:)但是,永远不会被调用。

根据Apple的文档,NSToolbar不会发送validateToolbarItem(_:)到基于视图的工具栏项目。为了对此进行测试,我将工具栏项目替换为图像工具栏项目,并且该工具栏按预期工作。

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

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

  • 子类化NSToolbar并重写validateVisibleToolbarItems(),然后将消息发送给第一响应者。在这里,我遇到了一个问题,即我无法向拆分视图控制器发送消息,因为它不在工具栏的响应者链之外。

  • 如上所述,子类NSToolbar,但是validateToolbarItem(_:)在响应者链中的控制器(例如NSWindowController)中实现。这将起作用,但随后我必须添加其他代码来处理菜单项不必要的内容。

是否有一个优雅的解决方案可以像在图像工具栏项和菜单项上一样好用?

cocoa nstoolbar nsmenuitem nstoolbaritem nsresponder

5
推荐指数
1
解决办法
641
查看次数