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

bee*_*eeb 5 macos swift swift2 nstouchbar

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

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

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

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

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

谢谢!

vom*_*omi 8

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

self.touchbar = nil

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

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


MrM*_*age 7

四个想法:

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

    viewController.touchBar = viewController.makeTouchBar()
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    viewController.touchBar = nil
    
    Run Code Online (Sandbox Code Playgroud)
    1. 设置应该在选中时显示额外项目的touchBar属性NSTableRowView,并确保包含otherItemsProxy在您的defaultItemIdentifiers.由于触摸条的内容由响应者链中的所有元素组成,这可能包括touchBar表行的属性(假设它可以成为第一响应者).

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