创建主窗口后添加NSTouchBar支持

时间:2016-12-29 16:04:03

标签: objective-c xcode cocoa macos-sierra nstouchbar

我试图添加支持,通过插件将NSTouchBar按钮暴露给我无法修改的应用程序。插件(共享库)在创建主窗口后在运行时加载。我已创建AppDelegate,如下所示:

@interface AppDelegate : NSResponder <NSTouchBarDelegate>
@end

使用@implmentation实现makeTouchBartouchBar功能:

- (NSTouchBar *) makeTouchBar
- (nullable NSTouchBarItem *) touchBar:(NSTouchBar *)touchBar
                       makeItemForIdentifier: (NSTouchBarItemIdentifier)identifier

我终于尝试将它注入到应用程序中,我在动态库中调用的onload函数中有以下内容,当它被加载到应用程序中时。

NSWindow *w = [NSApp mainWindow];

AppDelegate *a = [[AppDelegate alloc] init];
a.nextResponder = w.nextResponder;
w.nextResponder = a;

// Re-setting FirstResponder will trigger AppDelegate::makeTouchBar
// that was attached above.
NSResponder *n = w.firstResponder;
[w makeFirstResponder: nil];
[w makeFirstResponder: n];

然而......永远不会调用AppDelegate::touchBar,因此我的测试按钮永远不会填充触摸栏。

如果我在Xcode中创建一个新项目,并使用完全相同的AppDelegate实现(复制粘贴相同的@interface@implementation),我会得到两个功能按钮显示并响应按下事件,因此它的注射部分似乎被打破了。 (在Xcode中,所有内容都通过MainMenu.xib连接起来我猜)

更新 主要问题是应用程序的编译方式阻止了TouchBar的工作。也许建立在旧版Mac OS上。

1 个答案:

答案 0 :(得分:2)

如果这个对象确实应该充当应用程序委托(顾名思义) - 而不是将其插入主窗口的响应程序链中,最好将其实际设置为NSApp&#39; s delegate。构建触摸栏时也会使用设置代理人的触摸栏(请参阅NSTouchBar Discovery and the Responder Chain)。

如果这对您的插件不起作用(可能应用程序已经有一个需要的特定应用程序委托),您可以将其插入NSApp的响应程序链而不是mainWindow&# 39; S

这两者还具有使触摸条在应用程序级别而不是窗口关联的优点。因此,如果主/键窗口发生变化,将始终使用提供的触摸栏。