我试图添加对通过插件向应用程序公开NSTouchBar按钮的支持,否则将无法修改。插件是一个共享库,在主窗口创建后在运行时加载。我创建了一个AppDelegate,如下所示:
@interface AppDelegate : NSResponder <NSTouchBarDelegate>
@end使用实现makeTouchBar和touchBar函数的makeTouchBar:
- (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上。
发布于 2017-01-03 19:07:41
如果这个对象确实应该充当应用程序委托(顾名思义) --与其将其插入主窗口的响应链中,不如将其实际设置为NSApp的delegate。在构建触摸条时也使用set委托的touchBar (参见NSTouchBar发现与响应链)。
如果这对你的插件不起作用(也许应用程序已经有了它需要的一个特定的应用程序委托),你可以把它插入NSApp的响应链中,而不是mainWindow。
这两种方法的好处还在于使触摸条在应用程序级别而不是窗口上相关联。因此,如果主/键窗口发生更改,则将始终使用提供的触摸条。
https://stackoverflow.com/questions/41383194
复制相似问题