最近、アプリで問題が発生しました。UIViewControllerサブクラスの-awakeFromNib
メソッドがビューから消えていました。いろいろ調べてみたところ、-awakeFromNib
から-viewDidLoad
問題を解決しました。のようだ -awakeFromNib
は、UIViewControllerがnibからアーカイブ解除されたときに1回だけ呼び出され、-viewDidLoad
は、ビューがアーカイブ解除されるたびに呼び出されます。
それでは、ベストプラクティスは何ですか? UIViewControllerの-awakeFromNib
はビューにビューを追加しないでください。そのようなことは-viewDidLoad
。これを正しく理解していますか?それとも私が思ったよりも混乱していますか?
awakeFromNib
は、controller自体がnibからアーカイブ解除されるときに呼び出されます。 viewDidLoad
は、viewが作成/アーカイブ解除されるときに呼び出されます。この区別は、コントローラのビューが別のnibファイルに保存されている場合に特に重要です。
また、メモリ警告からの回復後にawakeFromNib
関数が呼び出されないことも重要です。ただし、viewDidLoad
関数が呼び出されます。
はい、それは正しいです。 awakeFromNib
に依存してそのようなタスクを実行するべきではありません。
awakeFromNib
は、.NETでデシリアライズ後に呼び出されるイベントに似ています。 viewDidLoad
は、.NETのLoad
イベントに似ています。
.NETの概念に精通していれば、これで十分だと思います。
私は例を挙げて答えようとします:
customCell
クラスと_customCell.xib
_ファイルを定義し、次に使用してセルをロードする場合- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options
、awakeFromNibは、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の場合、これはビューの設定後です。