1

NSWindowController (ファイル所有者として) と、ファイル所有者にバインドされた ArrayControllers を含む nib で大きな問題が発生しています。

サブクラス化された NSWindowController は問題ないように見えますが、ペン先内の NSObjectControllers、NSArrayControllers、および「カスタム」NSObjects はすべて、ペン先のロード後に 0x0 に設定されます。

すべてのコントローラーとオブジェクトは、IB で適切に「バインド」されています。NSObject サブクラスにはinitWithCoder. inits または awake に関する追加の要件はありますか。すべての init が本質的に何もしていないというわけではありませんが、return super. これは、参照されるすべてのオブジェクトが nib 内で設定 (バインド) されているためです。

ニブの装填順序と関係があるようです。そして、[super initWithWindowNibName:name]; に続いて、awakeFromNibの前にIBOutletsが利用可能であると信じるようになりました。

ドキュメントに基づいて、

Mac OS X v10.5 以降では、アウトレットを設定すると、登録されているオブザーバーに対してキー値監視 (KVO) 通知も生成されます。これらの通知は、すべてのオブジェクト間の接続が再確立される前に発生する可能性があり、オブジェクトのawakeFromNibメソッドが呼び出される前に確実に発生します。

さらに、

ロード時に nib ファイル内のオブジェクトをさらに構成する必要がある場合、最も適切なタイミングはnib-loading 呼び出しが戻った後です。その時点で、すべてのオブジェクトが作成、初期化され、使用できるようになります。

self = [super initWithWindowNibName:name] がnib-loading呼び出しであると信じるのは間違っていますか?

私のawakeFromNibのいくつかは、ウィンドウが表示されているときにのみ呼び出されます。すなわち。[myWindowController showWindow: nil];私のウィンドウは、ブロッキング呼び出しを行っているシートとして開かれているため、showWindow の後でこれらの配列コントローラーにアクセスするのは簡単ではありません。

4

1 に答える 1

2

self = [super initWithWindowNibName:name] が nib-loading 呼び出しであると信じるのは間違っていますか?

-[NSWindowController loadWindow]nib を実際にロードするメソッドです。直接呼び出す必要はありません。後者はandも-[NSWindowController window]呼び出すため、代わりに呼び出す必要があるのは です。-[NSWindowController windowWillLoad]-[NSWindowController windowDidLoad]

状態のドキュメントNSWindowController:

ウィンドウ コントローラーはプログラムで作成されたウィンドウを管理できますが、通常は nib ファイル内のウィンドウを管理します。nib ファイルには、他のウィンドウを含む他のトップレベル オブジェクトを含めることができますが、ウィンドウ コントローラの役割は、このプライマリ ウィンドウです。

これの結果、nib 内のウィンドウがロードされるまで何もロードされません。

これは私を何度か手に入れた「落とし穴」です!

于 2013-06-08T03:12:19.597 に答える