首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建主窗口后添加NSTouchBar支持

创建主窗口后添加NSTouchBar支持
EN

Stack Overflow用户
提问于 2016-12-29 16:04:02
回答 1查看 1.1K关注 0票数 2

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

代码语言:javascript
复制
@interface AppDelegate : NSResponder <NSTouchBarDelegate>
@end

使用实现makeTouchBartouchBar函数的makeTouchBar

代码语言:javascript
复制
- (NSTouchBar *) makeTouchBar
- (nullable NSTouchBarItem *) touchBar:(NSTouchBar *)touchBar
                       makeItemForIdentifier: (NSTouchBarItemIdentifier)identifier

最后,我尝试将其注入应用程序中,在动态库加载到应用程序时调用的onload函数中有以下内容。

代码语言:javascript
复制
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上。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-03 19:07:41

如果这个对象确实应该充当应用程序委托(顾名思义) --与其将其插入主窗口的响应链中,不如将其实际设置为NSApp的delegate。在构建触摸条时也使用set委托的touchBar (参见NSTouchBar发现与响应链)。

如果这对你的插件不起作用(也许应用程序已经有了它需要的一个特定的应用程序委托),你可以把它插入NSApp的响应链中,而不是mainWindow

这两种方法的好处还在于使触摸条在应用程序级别而不是窗口上相关联。因此,如果主/键窗口发生更改,则将始终使用提供的触摸条。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41383194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档