私はプロジェクトで NSWindowController を数回使用しており、この重要なクラスの背後にある概念を (非常に) 大まかに把握しているように感じます。この投稿で私がやりたいことは、私自身の理解を明確化/修正し、うまくいけば他の学習者が理解への第一歩を踏み出すのを助けることです. これは、概念、概要、およびベスト プラクティスの概要であり、最も有用であり、ドキュメントに欠けていることがよくあります。これが NSWindowController に対する私の見解です (質問は太字で散りばめられています):
- NSWindowController (NSWC) サブクラスは、(概念的には) すべてのウィンドウ nib のすぐ下に存在し、ユーザー インターフェイス要素とそれらが制御/表すモデル オブジェクトとの間の接着剤として機能します。基本的に、アプリケーション内のすべてのウィンドウには、独自の NSWC サブクラスが必要です。
- nib のファイルの所有者は、常に NSWC サブクラスである必要があります。これは、MainMenu.xib アプリケーションにも当てはまりますか?
- NSWC
window
プロパティは、常に InterfaceBuilder の NSWindow にリンクする必要があります。 - を使用して「init」メソッドをオーバーライドする必要があります
[super initWithWindowNibName:]
。これにより、参照時に[mycontroller window]
nib がロードされます。これは起動時に開かれますが、MainMenu.xib ウィンドウの NSWC にも当てはまりますか? - NSWC は重労働を行うべきではありません。単純にメッセージをオブジェクトのインスタンスに渡し、それらのオブジェクトを UI に表示する必要があります。
- バインディングを使用したり、テーブルなどのデリゲートとして機能したり、変更を観察したときに UI 要素を積極的に変更したり、上記のいずれかの組み合わせを使用して UI を変更したりできます (どちらを使用するかは問題と思われます)。味、すべての側面に長所と短所があります)。
- NSWC は、必要に応じて他の NSWC のインスタンスを作成できます (たとえば、1 回限りのサブウィンドウを開く場合)。
[mycontroller showWindow:nil]
関連するウィンドウを前面に表示するには、 を使用します。ウィンドウをシートとして表示する場合は、次のようなものを使用します。NSWindowController* mycontroller = [[MyController alloc] init]; [NSApp beginSheet: [mycontroller window] modalForWindow: [self window] modalDelegate: self didEndSelector: @selector(didEndMySheet:returnCode:contextInfo:) contextInfo: nil];
は親ウィンドウの NSWCのdidEndSelector:
メソッドである必要があり、 で「mycontroller」にアクセスして解放できます[sheet windowController]
。- ウィンドウを閉じるにはperformClose:
、NSWC のウィンドウのメソッドを呼び出します。
いくつかの質問:
- MainMenu ウィンドウの NSWC もアプリケーション デリゲートにする必要がありますか、それとも別のクラスにする必要がありますか?
- 同じように、メインの NSWC がファイルを処理 (ドラッグ/ドロップして開く) する必要がありますか、それともアプリのデリゲートに渡す必要がありますか?それとも好みの問題ですか?
これのいずれかが悪い習慣であるか、単に間違っている場合は修正してください。NSWindowController についての理解を深めたいと考えているため、(ベスト プラクティス、経験、落とし穴の形で) 追加情報をいただければ幸いです。
ありがとう、ローリー