私は、ビューとしてNSButtonとメインメニューにNSMenuItemを持つNSToolbarItemを持っています。どちらも同じアクションを持っており、特定のターゲットではなく最初のレスポンダに送信されます。このメソッドは最終的に、ウィンドウのコンテンツビューのビュー階層のどこかにあるNSSplitViewControllerのサブクラスに実装されます。私は両方の項目を検証したいが、そのコントローラにローカルないくつかの条件に依存しているので、その特定の分割ビューコントローラが検証を処理するようにする。関連するコントローラのNSToolbarItem検証
スプリットビューコントローラでvalidateToolbarItem(_:)
とvalidateMenuItem(_:)
をオーバーロードしました。メニュー項目の場合、これは期待どおりに機能しています。このメソッドが呼び出され、検証が行われます。しかし、validateToolbarItem(_:)
は決して呼び出されません。
Apple’s documentationによれば、NSToolbarはビューベースのツールバー項目にvalidateToolbarItem(_:)
を送信しません。これをテストするために、ツールバーのアイテムをイメージツールバーのアイテムに置き換え、そこに期待どおりに機能します。
これに基づいて、私はいくつかの解決策に出くわしましたが、私の望むものではありません。
サブクラスNSToolbarItemとオーバーライド
validate()
。しかし、コントローラのvalidateToolbarItem(_:)
がどのように呼び出されるのかについての指針はありません。サブクラスNSToolbarをオーバーライドして
validateVisibleToolbarItems()
をオーバーライドし、最初のレスポンダにメッセージを送信します。ここで私は、スプリットビューコントローラにメッセージを送ることができないという問題に取り掛かりました。なぜなら、ツールバーのレスポンダチェーンの外側にあるからです。サブクラスNSToolbarは上記と同じですが、NSWindowControllerなどレスポンダチェーン内にあるコントローラに
validateToolbarItem(_:)
を実装します。これは動作しますが、メニュー項目に必要でないものを処理するコードを追加する必要があります。
画像ツールバーの項目とメニュー項目のように機能する優れたソリューションがありますか?
私が探していたちょうどエレガントな解決策。どうもありがとう! – Eitot
美しい!これを共有してくれてありがとう。あなたは2つのことを説明してもらえますか?1)これはなぜ必要なのですか?なぜこれでCocoaはすでにこれをしていませんか? b)どのくらいの頻度でこれが呼び出されると思いますか?あなたのコードの私の迅速な実装では、それは非常に予期せず、そしてむしろ頻繁に呼び出されるようです。 –
@ jeff-h 1)NSToolbarItemの内部ビューは、NSControl以上のものでもかまいません。だから、Cocoaはそれが何であるか、それを検証する方法を知らない。 2)イベントトリガーとタイマーの組み合わせです。検証のタイミングの詳細は、参考文献(https://developer.apple.com/reference/appkit/nstoolbar/1516947-validatevisibleitems)で確認できます。 – 1024jp