以编程方式将 NSTouchBar 动态更新为 add/remove 个项目

Update NSTouchBar on the fly to add/remove items programmatically

我目前正在为我的 macOS 应用程序实现 NSTouchBar api。

此刻,我唯一拥有的触摸栏将主视图控制器作为其委托,我可以很好地向其添加项目。问题是,我需要其中一些项目仅在满足特定条件时出现(在 table 中选择了一行)。

假设我有一个布尔值,指示按钮是否应该可见。如果我的布尔值发生变化,如何将 NSTouchBar 动态更新为 show/hide 此按钮? (我不需要观察这个布尔值,我可以简单地在我已经实现的另一个方法中调用更新)

我现在所做的是:在 touchBar(:makeItemForIdentifier) 中,我有一个所有标识符的开关,在正确的 case 下,我 return [=13] =] 按钮,或者 nil 如果我的布尔值是 false.

我尝试在选择 table 的一行后再次调用 makeTouchBar,但它不会更新按钮的可见性,就好像没有再次调用 touchBar(:makeItemForIdentifier) 一样。

谢谢!

四个想法:

  1. 尝试将触摸栏的 defaultItemIdentifiers 更改为应显示的项目标识符集。请注意,如果用户自定义了触摸栏,这将是有问题的,但我认为按需交换项目和自定义触摸栏无论如何都不能很好地结合在一起。这还有一个好处,就是你不需要 return nil in touchBar(:makeItemForIdentifier:).
  2. 调用 makeTouchBar() 将创建一个新的 NSTouchBar 实例,但不会更改 touchBar 属性。试试像

    viewController.touchBar = viewController.makeTouchBar()
    

    viewController.touchBar = nil
    
    1. NSTableRowView 上设置 touchBar 属性 以便在选择时显示额外的项目,并确保在您的 otherItemsProxy 中包含defaultItemIdentifiers。由于touch bar的内容由响应者链中的所有元素组成,这可能包括table行的touchBar 属性(前提是它可以成为第一响应者)。

    2. 您确定在未选择该行时应隐藏这些项目吗?考虑禁用它们(例如,将它们包含的按钮的 enabled 属性 设置为 false)。

只需使视图控制器中的触摸栏无效:

self.touchbar = nil

然后将自动调用委托方法makeTouchBar()。使用您的标志,您可以轻松选择要显示的图标。

编辑:此解决方案已经过测试并且工作正常。