在 Xcode 个 Playgrounds 中实现 TouchBar 功能

Implement TouchBar functionality in Xcode Playgrounds

如何在仅使用 Xcode Playgrounds 的情况下实现 NSTouchBar?我意识到 NSTouchBar 及其伴随方法包括 makeTouchBar() 包含在 NSResponder class 中,它是 NSView 的超 class, NSViewControllerNSWindowSKViewNSView 的子class)

正是出于这个原因,我有点不确定如何访问 TouchBar。 NSResponder 的子class 太多了,我不确定哪一个是正确的。据我所知,我什至无法访问所有这些,包括 Playground 的 NSWindow,我怀疑它可能是我需要访问的那个。

我当前的设置是:

let containerView = SKView()
PlaygroundPage.current.liveView = containerView
let containterScene = SKScene()
containerView.presentScene(containterScene)

在检查响应链时,对于 SKView,我得到:

<SKScene> name:'(null)' frame:{{-250, -250}, {500, 500}} anchor:{0.5, 0.5}

对于 SKScene:

<SKView: 0x7fba36037a00>
<NSView: 0x7fba32d6fe80>
<PlaygroundViewBridgeService: 0x7fba32d569e0>
<NSNextStepFrame: 0x7fba32d76e20>
<NSWindow: 0x7fba32e177e0>

由于某些原因,SKScene 和 SKView 不在同一个链中,我似乎无法访问任何高于 SKView 的响应者。有没有办法扩展已经存在的功能 NSWindow?

另一个问题是许多关于使用 TouchBar 的教程需要访问 AppDelegate,我认为 Xcode Storyboards 中没有。

如能提供在 Storyboards 中实现 TouchBar 的任何帮助,我们将不胜感激。

解决方法其实很简单。创建 NSViewController 的自定义子类并在其中实现 TouchBar 覆盖功能。

然后执行上面的代码:

let containerView = CustomSKView()
let containterScene = CustomSKScene()
containerView.presentScene(containerScene)

添加了以下内容。

let containerViewController = CustomNSViewController()
containerViewController.view = containerView
PlaygroundPage.current.liveView = containerViewController.view

这会在响应链中设置您的自定义 NSViewController,使其能够处理 Touch Bar。也无需担心 App Delegate。