8

ビューとして NSButton を持つ NSToolbarItem と、メイン メニューに NSMenuItem があります。どちらも同じアクションを持ち、特定のターゲットではなく、ファーストレスポンダに送信されます。そのメソッドは、最終的に、ウィンドウのコンテンツ ビューのビュー階層のどこかにある NSSplitViewController のサブクラスに実装されます。両方の項目を検証したいのですが、特定の分割ビュー コントローラーに検証を任せます。これは、そのコントローラーに固有のいくつかの条件に依存しているためです。

私はオーバーライドvalidateToolbarItem(_:)validateMenuItem(_:)、その分割ビューコントローラーで。メニュー項目については、これは期待どおりに機能しています。メソッドが呼び出され、検証が行われます。validateToolbarItem(_:)ただし、呼び出されることはありません。

Apple のドキュメントによると、NSToolbar はvalidateToolbarItem(_:)ビューベースのツールバー項目に送信しません。これをテストするために、ツールバー項目を画像ツールバー項目に置き換えたところ、期待どおりに動作しました。

これに基づいて、いくつかの解決策に出くわしましたが、それらは私が望むものではありません。

  • NSToolbarItem をサブクラス化し、オーバーライドしますvalidate()。ただし、コントローラーvalidateToolbarItem(_:)を呼び出す方法についてのガイダンスはありません。

  • NSToolbar と overridevalidateVisibleToolbarItems()をサブクラス化し、最初の応答者にメッセージを送信します。ここで、ツールバーのレスポンダーチェーンの外側にあるため、スプリットビューコントローラーにメッセージを送信できないという問題に直面しています。

  • 上記のように NSToolbar をサブクラス化しますがvalidateToolbarItem(_:)、NSWindowController などのレスポンダー チェーン内にあるコントローラーに実装します。これは機能しますが、メニュー項目に不要なものを処理するために追加のコードを追加する必要があります。

画像ツールバー項目とメニュー項目の場合と同様に機能する、これに対するエレガントなソリューションはありますか?

4

1 に答える 1