3

Parent.xibとChild.xibの2つのペン先があります。

バインディングを簡素化するために、親ペン先の中に子ペン先を含めました。loadViewでプログラムによってサブビューを設定しました。問題は、awakeFromNibがChildのコントローラーで2回呼び出されることです。

なぜこれが起こっているのか理解できたと思います。親はロードを終了すると、awakeFromNibをオブジェクトに送信します。また、Childはペン先のファイル所有者であるため、それ自体でもawakeFromNibを呼び出します。

私はこの権利を理解していますか?私はもともと、awakeFromNibはインスタンスごとに1回だけ呼び出す必要があるという印象を受けていました。ペン先をペン先に埋め込むことはできませんか?

サンプルプロジェクトを参照してください:https ://github.com/panupan/AwakeFromNibTest

4

2 に答える 2

5

awakeFromNib設定したインスタンスなど、インスタンスごとに複数回呼び出すことができる状況があります。もう1つのケースは、複数のペン先オブジェクトをロードするコントローラーです。本当に必要な場合はこれを回避できますが、より良い設計はそうする必要はありません。NSNibAwakingプロトコルリファレンスから:

ファイルの所有者オブジェクトとそれに関連するnibファイルの間で1対1の対応を維持することをお勧めします。同じFile'sOwnerオブジェクトで2つのnibファイルをロードすると、そのオブジェクトのawakeFromNibメソッドが2回呼び出され、一部のデータ構造が望ましくない方法で再初期化される可能性があります。また、awakeFromNibメソッドの実装から他のnibファイルをロードしないようにすることをお勧めします。

あなたの特定の例では、あるnibファイルを別のnibファイルの中に埋め込む理由はありません。すべてのオブジェクトを単一のnibファイルに含めるという便利さなしに、両方をメモリにロードする必要があるというメモリフットプリントの欠点があります。それらを分割しNSObjectController、nibファイル内のインスタンスを使用してそれらの間のバインディングを処理する必要があります。

于 2012-07-20T23:09:11.343 に答える
0

2つの異なるファイル所有者がいる場合awakeFromNibでも、2回呼び出されます。

NSWindowControllerサブクラス(MyWindowController)があり、そのペン先に、ペン先からビューをロードするProjectControllerオブジェクトが含まれている場合、ビューのコントローラーが呼び出しを受け取り、元のオブジェクトが再び受け取ります。awakeFromNibawakeFromNibProjectControllerawakeFromNib

于 2021-03-13T22:22:25.520 に答える