1

我正在尝试在 SDL 应用程序中创建一个 NSTouchBar,我需要将一个响应程序附加到 NSWindow 对象(这是 SDL 提供给 Cocoa 窗口系统的唯一访问权限)。

https://developer.apple.com/reference/appkit/nstouchbar

如果在对象中显式采用 NSTouchBarProvider 协议,则 还必须在 NSTouchBar 方法中显式发送关联的键值观察通知;这使系统可以对条形图的变化做出适当的响应。

这是什么意思,我该怎么做?我看到很多关于如何订阅通知的文档,但没有看到如何发送它们?

现在我有:

@interface MyTouchBarResponder : NSResponder <NSTouchBarDelegate>

- (id)init;
- (NSTouchBar *)makeTouchBar;
- (nullable NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier;
@property(strong, readonly) NSTouchBar *touchBar;

@end

我用我在这里问过的上一个问题的代码将它附加到窗口:如何从 NSWindow 对象创建 NSTouchBar?

touchBarResponder.nextResponder = window.nextResponder;
window.nextResponder = touchBarResponder;

但我的回调从未被调用过(我把exit(0)它们放进去让它非常明显)。当我将代码直接破解到 SDL 库中时,一切正常,但这不是一个可行的永久解决方案。

谢谢你。

4

1 回答 1

1

首先,您的自定义响应者应该符合NSTouchBarProvider(在上面,您声明了touchBar属性,但不是显式符合性)

其次,您要确保您的自定义响应者在窗口的响应者链中(无论是第一个响应者还是在链中的后面)。使用上述代码调整响应者链后,您希望调用-makeFirstResponder:并传入窗口中的某个视图(如果您需要该视图作为第一响应者)或使用自定义响应者对象。然后,您应该验证窗口firstResponder是那个对象。

有了这些,您应该在touchBar窗口显示并设置为关键后至少接到一个电话。

要回答关于键值观察通知的问题,当您想要更改从touchBar. 在一般情况下,这不是必需的,因为在静态触摸栏情况下是不必要的,即使在动态情况下,您也可以依靠在defaultItemIdentifiers先前创建的触摸栏上设置 ,它会更新。但是,如果您需要更改触摸栏对象,则需要确保在更改返回值时发送-willChangeValueForKey:-didChangeValueForKey:发送。这个关于 KVO 的开发人员文档更详细。touchBar

于 2016-11-28T18:43:43.937 回答