我应该使用什么,-awakeFromNib或-viewDidLoad?

我最近有一个问题,在我的应用程序中,我在UIViewController子类的-awakeFromNib方法中创build的一些子视图正从视图中消失。 经过一番-awakeFromNib之后,我发现将-awakeFromNib放到-awakeFromNib中的-viewDidLoad解决了这个问题。 看起来-awakeFromNib在UIViewController从nib被解除存档时只被调用一次,并且-viewDidLoad在每次视图被解除存档时被调用。

那么最佳做法是什么? 它看起来像UIViewController的-awakeFromNib不应该添加任何意见的视图,这种东西应该在-viewDidLoad 。 我正确理解这个吗? 还是比我想象的更困惑?

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

同样重要的是, awakeFromNib函数在从内存中恢复后不会被调用。 但是, viewDidLoad函数将被调用。

是的,这是正确的。 你不应该依赖awakeFromNib来完成这样的任务。

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

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

我会试着回答一个例子:

如果定义customCell类和customCell.xib文件,然后使用加载单元格
- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options ,当xib中的对象被解除存档时, awakeFromNib被调用。

如果你定义了一个customViewController ,那么当使用- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil创build- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 。 当viewDidLoad加载到视图层次结构中时,它将被调用。

一些相关的混淆方法:

  • (空隙)的loadView; 这是子类应该创build自定义视图层次的地方,如果他们不使用笔尖。 如果你不指定一个nib名字,那么loadView会尝试加载一个名字与你的视图控制器类相同的nib。 如果不存在这样的nib,那么你必须调用-setView:before -view被调用,或者重写-loadView方法来以编程方式设置你的视图。 -loadView不应该直接调用。

  • (void)viewDidLoad:视图加载完成后调用。 对于在代码中创build的viewControllers,这是after-loadView。 对于从笔尖取消存档的视图控制器,这是在视图设置之后。