web-dev-qa-db-ja.com

-awakeFromNibと-viewDidLoadのどちらを使用すべきですか?

最近、アプリで問題が発生しました。UIViewControllerサブクラスの-awakeFromNibメソッドがビューから消えていました。いろいろ調べてみたところ、-awakeFromNibから-viewDidLoad 問題を解決しました。のようだ -awakeFromNibは、UIViewControllerがnibからアーカイブ解除されたときに1回だけ呼び出され、-viewDidLoadは、ビューがアーカイブ解除されるたびに呼び出されます。

それでは、ベストプラクティスは何ですか? UIViewControllerの-awakeFromNibはビューにビューを追加しないでください。そのようなことは-viewDidLoad。これを正しく理解していますか?それとも私が思ったよりも混乱していますか?

53
Mike Akers

awakeFromNibは、controller自体がnibからアーカイブ解除されるときに呼び出されます。 viewDidLoadは、viewが作成/アーカイブ解除されるときに呼び出されます。この区別は、コントローラのビューが別のnibファイルに保存されている場合に特に重要です。

63
Lily Ballard

また、メモリ警告からの回復後にawakeFromNib関数が呼び出されないことも重要です。ただし、viewDidLoad関数が呼び出されます。

24
Prcela

はい、それは正しいです。 awakeFromNibに依存してそのようなタスクを実行するべきではありません。

awakeFromNibは、.NETでデシリアライズ後に呼び出されるイベントに似ています。 viewDidLoadは、.NETのLoadイベントに似ています。

.NETの概念に精通していれば、これで十分だと思います。

12
Mehrdad Afshari

私は例を挙げて答えようとします:

customCellクラスと_customCell.xib_ファイルを定義し、次に使用してセルをロードする場合
- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)optionsawakeFromNibは、xib内のオブジェクトがアーカイブ解除されたときに呼び出されます。

customViewControllerを定義すると、- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNilを使用してcustomViewControllerが作成されます。 viewDidLoadは、ビュー階層にロードされるときに呼び出されます。

いくつかの関連する紛らわしい方法:

  • (void)loadView;これは、サブクラスがペン先を使用していない場合にカスタムビュー階層を作成する場所です。 nib名を指定しない場合、loadViewは、View Controllerのクラスと同じ名前のnibをロードしようとします。そのようなペン先が存在しない場合は、-viewを呼び出す前に-setView:を呼び出すか、-loadViewメソッドをオーバーライドして、プログラムでビューを設定する必要があります。 -loadViewを直接呼び出さないでください。

  • (void)viewDidLoad:ビューがロードされた後に呼び出されます。コードで作成されたviewControllerの場合、これは-loadViewの後です。ペン先からアーカイブされていないView Controllerの場合、これはビューの設定後です。

7
hrchen

ViewControllerの場合、IBOutletsはviewDidLoad()で利用可能です

ここでstackViewはViewControllerのIBOutletを表し、stackViewはawakeFromNibでnilです、ただし、viewDidLoad()が呼び出されたときにインスタンス化されています。

IBOutlets state in awakeFromNib() vs IBOutlet state in viewDidLoad()

0
andreskwan