2

我正在尝试NSTouchBar通过插件向我无法修改的应用程序添加对公开按钮的支持。该插件是一个共享库,在创建主窗口后在运行时加载。我创建了一个AppDelegate如下:

@interface AppDelegate : NSResponder <NSTouchBarDelegate>
@end

使用@implmentation实现makeTouchBarandtouchBar功能的 an:

- (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),我会得到既显示又响应按下事件的功能按钮,因此注入部分似乎被破坏了。MainMenu.xib(在 Xcode 中,我猜一切都是通过连接的)

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

4

1 回答 1

2

如果这个对象真的应该充当应用程序委托(顾名思义)——而不是将它插入到主窗口的响应程序链中,最好将它实际设置为 NSApp 的delegate. set delegate 的 touchBar 也用于构建触摸栏(参见NSTouchBar Discovery 和 Responder Chain)。

如果这对您的插件不起作用(可能应用程序已经有它需要的特定应用程序委托),您可以将其插入 NSApp 的响应者链而不是mainWindow's.

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

于 2017-01-03T19:07:41.097 回答