6

xcode 4.5 で新しいプロジェクトを作成し、viewcontroller を呼び出しました。

-(id)initWithNibName:バンドル:

デフォルトのプロジェクトテンプレートで呼び出されたappdelegateから、私はストーリーボードを使用していませんが、awakeFromNibは呼び出されませんでした。私も検索しましたが、awakeFromNibが呼び出されない理由を理解できませ んでした。

-(void)awakeFromNib 「Interface Builder アーカイブまたは nib ファイルからロードされた後、レシーバーをサービス用に準備します」に関する Apple のドキュメント。「NSCodingプロトコルに準拠するオブジェクト (UIView および UIViewController のすべてのサブクラスを含む) は、initWithCoder: メソッドを使用して初期化されます。NSCoding プロトコルに準拠しないすべてのオブジェクトは、init メソッドを使用して初期化されます。すべてのオブジェクトがインスタンス化および初期化された後、 nib-loading コードは、これらすべてのオブジェクトのアウトレットとアクションの接続を再確立します。次に、オブジェクトの awakeFromNib メソッドを呼び出します。」

私の質問は、xib ファイルが読み込まれたときに awakeFromNib が呼び出されないのはなぜですか? 私は何か間違ったことをしていますか?詳しく説明してください

4

2 に答える 2

11

awakeFromNib: ViewControllerがnibファイル内にある場合にのみ呼び出されます。
この場合、init initWithNibName:bundleを使用してView Controllerを初期化するため、View Controllerのコンテンツは、View Controller自体ではなく、nib内にあります
xibファイルを開き、xib内のオブジェクトをドラッグして、クラスをビューコントローラーのクラス名に設定すると、awakeFromNibが呼び出されます(この場合、ビューコントローラーを手動で初期化する必要はありません)。
したがって、ビューコントローラをxibファイルに含めることと、ビューコントローラをxibファイルに含まないが、すべてのコンテンツをxibファイルからロードすることの違いに注意してください。

PS: 私はnibとxibを同じ意味で使用しました。

編集
私はこれを回避する方法を説明するのを忘れました。初期化されたアウトレットで物事を行うためにviewDidLoadをオーバーライドします。

于 2012-12-05T18:39:25.693 に答える
2

-(id)initWithNibName:bundle: メソッドを -(void)awakeFromNib の代わりにサブクラスに追加してみませんか?

私の「awakeFromNib」メソッドは問題なく呼び出されますが、ビューコントローラーを次のようにロードします:

myViewController *vc = [[[NSBundle mainBundle] loadNibNamed:@"myViewController" owner:self options:nil] objectAtIndex:0];

代わりにinitWithNibNameを使用しているため、awakeFromNibが呼び出されないのではないかと思いますか?

EDIT:XCodeによって作成されたデフォルトプロジェクトのViewControllerにawakeFromNibを追加しているというコメントを見ました。プロジェクトを作成したときに、「ストーリーボードを使用する」ボックスのチェックを外しましたか? ペン先がプロジェクトのメイン ストーリーボードの内側にある場合は、ジャンプしなければならない追加のフープがいくつかある可能性があります。

于 2012-12-05T19:21:26.680 に答える