7

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

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

考虑我有一个布尔值,指示按钮是否应该可见。如果我的布尔值发生变化,如何即时更新 NSTouchBar 以显示/隐藏此按钮?(我不需要观察这个布尔值,我可以简单地用我已经实现的另一种方法调用更新)

我现在所做的如下:在 中touchBar(:makeItemForIdentifier),我有一个用于所有标识符的开关,在正确的 下case,我要么NSCustomTouchBarItem使用按钮返回 ,要么nil如果我的布尔值是false

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

谢谢!

4

2 回答 2

10

四个想法:

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

    viewController.touchBar = viewController.makeTouchBar()
    

    或者

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

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

于 2016-11-23T09:11:11.093 回答
8

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

self.touchbar = nil

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

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

于 2016-11-28T08:16:12.487 回答