12

複数のNSDocumentを開くことができるアプリケーションがあります。このアプリケーションには、最前面のドキュメントに適用したいいくつかの機能を含む単一のユーティリティウィンドウがあります。

ここではバインディングを使用しようとしているので、ユーティリティウィンドウのユーザーインターフェイスを最前面のドキュメントにクリーンにバインドする方法がコツです。目標は、最前面のドキュメントウィンドウを切り替えると、ユーティリティウィンドウのビューが更新されることです。最前面のドキュメントのモデルのプロパティにバインドされているコントロールは、ドキュメントのモデルなどで状態が変化したときに適切に更新されます。

このようなウィンドウからアクションを送信する場合は、ファーストレスポンダーを使用するだけで簡単です。ドキュメントオブジェクトは、レスポンダーチェーンを介してアクションをインターセプトできます。しかし、私はこれ以上のものが欲しいです、そしてもちろんあなたはファーストレスポンダーに拘束することはできません。

私が持っているいくつかのアイデア:

  • 共有ウィンドウのペン先にオブジェクトコントローラーを配置します。ドキュメントウィンドウの最前面のステータスが変更されたら、そのバインディングの内容を変更します。これの欠点は、別の種類のユーティリティウィンドウがある場合、ドキュメントウィンドウからそのユーティリティウィンドウへのバインディングも忘れずに接続する必要があることです。
  • ウィンドウリストをトラバースして、最前面のドキュメントウィンドウを取得するアクセサをアプリケーションデリゲートに作成します。私のユーティリティウィンドウは、アプリケーションデリゲートのメソッドを介してバインドするだけです。ここでの欠点は、KVOに準拠していないことです
  • アプリケーションデリゲートにゲッターとセッターを配置して、最前面のドキュメントを決定します(おそらく、KVOに準拠するように設定しますか?それは理にかなっていますか?)。おそらく、ウィンドウ通知を使用して、ウィンドウがメインステータスを失ったときにivarを適切な値に設定します。更新:私は今のところこれを使用しています、そしてそれは実際にはかなりきれいに見えます。ドキュメントウィンドウのwindowDidBecomeMain通知から値を設定し、windowWillCloseでそれをクリアします(現在の値の場合)。大きな異議がない限り、これはおそらく私が使用するアプローチです。
  • 1つのアイデアは、mainWindow.windowController.documentにバインドすることでした...これは、共有ウィンドウがメインになると、このバインドがなくなることを除いて、近くなります。したがって、実際には、最前面のドキュメントウィンドウのコントローラー(および適切なクラス)を見つける必要があります。

これらのどれも完全に正しいようには見えません。私が見逃しているこれを行うためのより良い方法はありますか?

4

5 に答える 5

4

私は常に共有アプリケーションを介してバインドしてきましたがmainWindow.document、これは正常に機能します。ドキュメントのないウィンドウがある場合は、いくつかのフィルター基準に基づいて値をmainYourKindOfWindow監視および更新することによって実装されるキーを追加することができます。mainWindow

于 2008-10-22T17:55:51.987 に答える
3

Leopard の TextEdit は、そのインスペクタに対してこれを行います。file:///Developer/Examples/AppKit/TextEdit で確認してください。

于 2008-10-23T02:10:33.377 に答える
0

Leopard の TextEdit は、そのインスペクタに対してこれを行います。>file:///Developer/Examples/AppKit/TextEdit で確認してください。

TextEdit では、インスペクターの値は中間オブジェクト コントローラーを介してバインドされます。コントローラーのコンテンツ オブジェクトは、共有アプリケーションの mainWindow にバインドされます。

コンテンツを mainWindow.firstResponder にバインドし、「該当しないキーの発生」のチェックを外すことができます。

于 2009-04-11T13:31:25.790 に答える
0
  • 共有ウィンドウのペン先にオブジェクトコントローラーを配置します。ドキュメント ウィンドウが最前面のステータスを変更すると、そのバインドの内容が変更されます。

それは私にとって最も理にかなっています。コンテンツをドキュメント インスタンス ( [NSDocumentController currentDocument]) に変更します。

これの欠点は、別の種類のユーティリティ ウィンドウを使用する場合、ドキュメント ウィンドウからそのユーティリティ ウィンドウへのバインディングも忘れずに接続する必要があることです。

は?私はこれを理解していません。

于 2008-10-22T17:57:24.153 に答える
0

メイン ウィンドウではなく、キー ウィンドウを使用します。KVO は NSApplication の keyWindow プロパティでサポートされていない可能性がありますが、動作しない場合でも NSNotifications を使用できます。これは、NSDocumentController の currentDocument が keyWindow を使用しているため、組み込みの機能をより適切に表しているためです。また、パネルがキーウィンドウにならないように設定することもできます。

于 2010-12-14T00:07:39.073 に答える