2

NSTouchBar他の方法では変更できないアプリケーションに、プラグインを介してボタンを公開するためのサポートを追加しようとしています。共有ライブラリであるプラグインは、メイン ウィンドウが作成された後、実行時に読み込まれます。私はAppDelegate次のように作成しました:

@interface AppDelegate : NSResponder <NSTouchBarDelegate>
@end

and関数@implmentationを実装する を使用すると、次のようになります。makeTouchBartouchBar

- (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をコピーして貼り付ける) を使用すると、表示され、プレス イベントに応答する機能ボタンが表示されるため、壊れているように見えるのはインジェクション部分です。(Xcodeでは、すべてが接続されていると思います)@interface@implementationMainMenu.xib

更新: 主な問題は、TouchBar が機能しないようにアプリケーションがコンパイルされたことです。おそらく古いバージョンの Mac OS 上に構築されています。

4

1 に答える 1

2

このオブジェクトが (名前が示すように) 本当にアプリケーション デリゲートとして機能する必要がある場合は、メイン ウィンドウのレスポンダー チェーンに挿入するのではなく、実際に NSApp のdelegate. セット デリゲートの touchBar は、タッチ バーを作成するときにも使用されます (「NSTouchBar ディスカバリーとレスポンダー チェーン」を参照)。

プラグインでそれが機能しない場合 (アプリケーションに必要な特定のアプリ デリゲートが既にある可能性があります)、 の代わりに NSApp のレスポンダー チェーンに挿入できますmainWindow

これらの両方には、ウィンドウではなくアプリケーションレベルでタッチバーを関連付けることができるという利点もあります。そのため、メイン/キー ウィンドウが変更された場合、提供されたタッチ バーが常に使用されます。

于 2017-01-03T19:07:41.097 に答える