如何在 SwiftUI MacOS App 中使用 NSTouchBar?

Posted

技术标签:

【中文标题】如何在 SwiftUI MacOS App 中使用 NSTouchBar?【英文标题】:How can I use NSTouchBar in SwiftUI MacOS App? 【发布时间】:2020-05-08 15:45:41 【问题描述】:

我正在尝试在 SwiftUI 中为我的 MacOS 应用程序添加 TouchBar 支持。

我发现我必须打电话..

  NSApp.isAutomaticCustomizeTouchBarMenuItemEnabled = true

.. 在我的 AppDelegate 中。但是现在创建TouchBar 的最佳方法是什么?我可以将它添加到我的 Mac 应用程序菜单的 Storyboard 中,还是需要以编程方式创建它?

当我按照 Apple 文档进行操作时,我明白了这一点:

您可以通过将 Touch Bar 添加到情节提要中的视图控制器来创建一个 Touch Bar,或者通过重写 NSResponder 的 makeTouchBar() 函数以编程方式创建一个。

是否可以创建一个自己的 NSViewController,然后将其嵌入到 NSNiewController 中表示?

也许有人对我如何在 SwiftUI 中支持 TouchBar 有一个很好的建议。

【问题讨论】:

【参考方案1】:

最简单的方法是在您的逻辑适用时为视图使用特定标识符,如下例所示

struct ContentView: View 
  var body: some View 
     SomeView()      // << your view here 
        .touchBar 
            Button("Do") 
               // .. Do something here
            
        
  

所以当视图出现时,相关的 Touch Bar 按钮也会出现。

对于更复杂的情况,您可以查看TouchBar 和相应的扩展

extension View 

    /// Sets the `TouchBar` to be shown in the Touch Bar when applicable.
    @available(ios, unavailable)
    @available(tvOS, unavailable)
    @available(watchOS, unavailable)
    public func touchBar<Content>(_ touchBar: TouchBar<Content>) -> some View where Content : View

    /// Sets the `TouchBar` content to be shown in the Touch Bar when applicable.
    @available(iOS, unavailable)
    @available(tvOS, unavailable)
    @available(watchOS, unavailable)
    public func touchBar<Content>(@ViewBuilder content: () -> Content) -> some View where Content : View

【讨论】:

谢谢。我没有找到 .touchBar() 真是太可惜了。我必须在我的系统偏好设置中启用“使用键盘导航在控件之间移动焦点”,然后我可以在虚拟触摸栏上看到它。谢谢! 我必须在 .touchBar() 之前添加 .focusable() 才能使其工作。可能是一个错误。

以上是关于如何在 SwiftUI MacOS App 中使用 NSTouchBar?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:如何在 macOS 应用程序中实现编辑菜单

如何删除 macOS SwiftUI App 中的“新窗口”选项?

如何从 Mac OS 中的 SwiftUI 列表中删除底部/顶部项目填充

在 macOS 上的 SwiftUI 列表视图中选择和删除核心数据实体

SwiftUI:如何在 macOS 11 上使用 NSSearchToolBarItem?

SwiftUI MacOS App AVPlayer 不适用于视频 URL