複数のNSDocumentを開くことができるアプリケーションがあります。このアプリケーションには、最前面のドキュメントに適用したいいくつかの機能を含む単一のユーティリティウィンドウがあります。
ここではバインディングを使用しようとしているので、ユーティリティウィンドウのユーザーインターフェイスを最前面のドキュメントにクリーンにバインドする方法がコツです。目標は、最前面のドキュメントウィンドウを切り替えると、ユーティリティウィンドウのビューが更新されることです。最前面のドキュメントのモデルのプロパティにバインドされているコントロールは、ドキュメントのモデルなどで状態が変化したときに適切に更新されます。
このようなウィンドウからアクションを送信する場合は、ファーストレスポンダーを使用するだけで簡単です。ドキュメントオブジェクトは、レスポンダーチェーンを介してアクションをインターセプトできます。しかし、私はこれ以上のものが欲しいです、そしてもちろんあなたはファーストレスポンダーに拘束することはできません。
私が持っているいくつかのアイデア:
- 共有ウィンドウのペン先にオブジェクトコントローラーを配置します。ドキュメントウィンドウの最前面のステータスが変更されたら、そのバインディングの内容を変更します。これの欠点は、別の種類のユーティリティウィンドウがある場合、ドキュメントウィンドウからそのユーティリティウィンドウへのバインディングも忘れずに接続する必要があることです。
- ウィンドウリストをトラバースして、最前面のドキュメントウィンドウを取得するアクセサをアプリケーションデリゲートに作成します。私のユーティリティウィンドウは、アプリケーションデリゲートのメソッドを介してバインドするだけです。ここでの欠点は、KVOに準拠していないことです
- アプリケーションデリゲートにゲッターとセッターを配置して、最前面のドキュメントを決定します(おそらく、KVOに準拠するように設定しますか?それは理にかなっていますか?)。おそらく、ウィンドウ通知を使用して、ウィンドウがメインステータスを失ったときにivarを適切な値に設定します。更新:私は今のところこれを使用しています、そしてそれは実際にはかなりきれいに見えます。ドキュメントウィンドウのwindowDidBecomeMain通知から値を設定し、windowWillCloseでそれをクリアします(現在の値の場合)。大きな異議がない限り、これはおそらく私が使用するアプローチです。
- 1つのアイデアは、mainWindow.windowController.documentにバインドすることでした...これは、共有ウィンドウがメインになると、このバインドがなくなることを除いて、近くなります。したがって、実際には、最前面のドキュメントウィンドウのコントローラー(および適切なクラス)を見つける必要があります。
これらのどれも完全に正しいようには見えません。私が見逃しているこれを行うためのより良い方法はありますか?