gpt4 book ai didi

objective-c - 创建主窗口后添加 NSTouchBar 支持

转载 作者:行者123 更新时间:2023-12-03 16:35:10 27 4
gpt4 key购买 nike

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

@interface AppDelegate : NSResponder <NSTouchBarDelegate>
@end

使用实现 makeTouchBartouchBar 函数的 @implmentation:

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

我最终尝试将它注入(inject)到应用程序中,当动态库加载到应用程序中时,我在动态库中调用的 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),我得到的功能按钮既显示又响应新闻事件,因此注入(inject)部分似乎已损坏。 (我猜在 Xcode 中,一切都是通过 MainMenu.xib 连接的)

更新:主要问题是应用程序的编译方式阻止了 TouchBar 的工作。可能是基于旧版本的 Mac OS 构建的。

最佳答案

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

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

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

关于objective-c - 创建主窗口后添加 NSTouchBar 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41383194/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com