动态更新NSTouchBar以编程方式添加/删除项目

时间:2016-11-23 08:59:15

标签: swift macos swift2 nstouchbar

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

此时,我唯一的触控条有主视图控制器作为其委托,我可以很好地添加项目。问题是,我需要其中一些项目仅在满足某个条件时才会出现(在表格中选择了一行)。

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:7)

四个想法:

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

    这样的东西
    viewController.touchBar = viewController.makeTouchBar()
    

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

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

答案 1 :(得分:3)

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

self.touchbar = nil

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

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