我试图添加支持,通过插件将NSTouchBar
按钮暴露给我无法修改的应用程序。插件(共享库)在创建主窗口后在运行时加载。我已创建AppDelegate
,如下所示:
@interface AppDelegate : NSResponder <NSTouchBarDelegate>
@end
使用@implmentation
实现makeTouchBar
和touchBar
功能:
- (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上。
答案 0 :(得分:2)
如果这个对象确实应该充当应用程序委托(顾名思义) - 而不是将其插入主窗口的响应程序链中,最好将其实际设置为NSApp&#39; s delegate
。构建触摸栏时也会使用设置代理人的触摸栏(请参阅NSTouchBar Discovery and the Responder Chain)。
如果这对您的插件不起作用(可能应用程序已经有一个需要的特定应用程序委托),您可以将其插入NSApp的响应程序链而不是mainWindow
&# 39; S
这两者还具有使触摸条在应用程序级别而不是窗口关联的优点。因此,如果主/键窗口发生变化,将始终使用提供的触摸栏。