我应该使用哪个-awakeFromNib或-viewDidLoad?

Mik*_*ers 54 cocoa-touch

我最近在我的应用程序中遇到了一个问题,我在UIViewController子类的-awakeFromNib方法中创建的一些子视图正 从视图中消失.经过一番探索之后,我发现移动我输入的代码-awakeFromNib-viewDidLoad解决问题.-awakeFromNib当UIViewController从nib中取消归档时,似乎只调用一次,并且-viewDidLoad每次取消归档视图时都会调用它.

那么最佳做法是什么?看起来UIViewController -awakeFromNib不应该向视图添加任何视图,应该完成那种东西-viewDidLoad.我理解正确吗?还是我比我想的更困惑?

Lil*_*ard 65

awakeFromNib控制器本身从笔尖取消归档时调用.viewDidLoad在创建/取消存档视图时调用.当控制器的视图存储在单独的nib文件中时,这种区别尤为重要.

  • iOS开发者要小心[iOS上的行为不同](http://stackoverflow.com/a/2196262/618653) (7认同)

Prc*_*ela 24

同样重要的是,awakeFromNib从内存警告恢复后永远不会调用该函数.但是,该viewDidLoad函数将被调用.

  • @khunshan不,iOS中的视图不再像过去那样自动卸载. (3认同)
  • 它在2016年仍然有效吗? (2认同)

Meh*_*ari 12

是的,这是对的.你不应该真的依赖于awakeFromNib做那种任务.

awakeFromNib类似于在.NET中反序列化后调用的事件.viewDidLoad类似于Load.NET中的事件.

如果您熟悉.NET中的概念,我认为这应该足够了.


hrc*_*hen 7

我将尝试通过举例来回答:

如果定义customCell类和customCell.xib文件,然后通过使用加载单元格
- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options,则在取消归档xib中的对象时调用awakeFromNib.

如果您定义了a customViewController,那么在customViewController使用时创建- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil.viewDidLoad在加载到视图层次结构中时将被调用.

一些相关的混淆方法:

  • (空隙)的loadView; 这是子类在不使用nib时应创建自定义视图层次结构的位置.如果未指定nib名称,则loadView将尝试加载名称与视图控制器类相同的nib.如果不存在这样的nib,则必须在调用-view之前调用-setView:或覆盖-loadView方法以编程方式设置视图.永远不应该直接调用-loadView.

  • (void)viewDidLoad:在加载视图后调用.对于在代码中创建的viewControllers,这是在-loadView之后.对于从nib取消归档的视图控制器,这是在设置视图之后.