我应该使用什么,-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。 对于从笔尖取消存档的视图控制器,这是在视图设置之后。