1

SDL アプリケーションで NSTouchBar を作成しようとしていますが、レスポンダを NSWindow オブジェクトにアタッチする必要があります (SDL が Cocoa ウィンドウ システムに与える唯一のアクセスです)。

https://developer.apple.com/reference/appkit/nstouchbar

オブジェクトで NSTouchBarProvider プロトコルを明示的に採用する場合は、 NSTouchBar メソッド内で関連するキー値監視通知も明示的に送信する必要があります。これにより、システムはバーの変化に適切に対応できます。

それはどういう意味ですか、どうすればいいですか?通知をサブスクライブする方法についてのドキュメントはたくさんありますが、通知を送信する方法についてはわかりません。

今私は持っています:

@interface MyTouchBarResponder : NSResponder <NSTouchBarDelegate>

- (id)init;
- (NSTouchBar *)makeTouchBar;
- (nullable NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier;
@property(strong, readonly) NSTouchBar *touchBar;

@end

ここで尋ねた以前の質問のコードを使用して、ウィンドウにアタッチしています: How to create an NSTouchBar from an NSWindow object?

touchBarResponder.nextResponder = window.nextResponder;
window.nextResponder = touchBarResponder;

しかし、コールバックが呼び出されることはありません (exit(0)明確にするためにコールバックを入れています)。コードを SDL ライブラリに直接ハックすると、期待どおりに動作しますが、これは実行可能な恒久的な解決策ではありません。

ありがとうございました。

4

1 に答える 1

1

まず、カスタム レスポンダは準拠する必要がありますNSTouchBarProvider(上記では、プロパティを宣言しtouchBarますが、明示的な準拠は宣言しません)。

2 番目に、カスタム レスポンダーがウィンドウのレスポンダー チェーンにあることを確認する必要があります (最初のレスポンダーか、チェーンの直後か)。上記のコードでレスポンダー チェーンを調整した後-makeFirstResponder:、ウィンドウ内のビュー (そのビューをファーストレスポンダーにする必要がある場合) またはカスタム レスポンダー オブジェクトを呼び出して渡します。次に、ウィンドウfirstResponderがそのオブジェクトであることを確認する必要があります。

touchBarこれらを配置すると、ウィンドウが表示されてキーが作成された後に、少なくとも 1 回は を呼び出す必要があります。

から返される実際の NSTouchBar オブジェクトを変更する場合に必要な、キー値監視通知に関する質問に答えるにはtouchBar。通常、これは必要ありません。静的なタッチ バーの場合は必要ないためです。動的な場合でもdefaultItemIdentifiers、以前に作成したタッチ バーに を設定するだけで更新されます。ただし、タッチ バー オブジェクトを変更する必要がある場合は、戻り値を変更したときに-willChangeValueForKey:-didChangeValueForKey:が送信されることを確認する必要があります。KVO に関するこの開発者向けドキュメントでは、さらに詳しく説明しています。touchBar

于 2016-11-28T18:43:43.937 に答える