我最近在我的应用程序中遇到了一个问题,我在UIViewController子类的-awakeFromNib
方法中创建的一些子视图正从视图中消失。经过一番探索后,我发现将-awakeFromNib
放入-viewDidLoad
的代码移动到-awakeFromNib
后就解决了问题。似乎只有在从笔尖取消归档UIViewController时才调用-viewDidLoad
一次,并且每次取消归档视图时都会调用-awakeFromNib
。
那么最佳做法是什么?看起来UIViewController的-viewDidLoad
不应该向视图添加任何视图,这种东西应该在{{1}}中完成。我理解正确吗?还是我比我想的更困惑?
答案 0 :(得分:63)
awakeFromNib
。创建/取消归档视图时会调用viewDidLoad
。当控制器的视图存储在单独的nib文件中时,这种区别尤为重要。
答案 1 :(得分:24)
同样重要的是,从内存警告恢复后永远不会调用awakeFromNib
函数。但是,将调用viewDidLoad
函数。
答案 2 :(得分:12)
是的,这是对的。你不应该真的依赖awakeFromNib
来完成这类任务。
awakeFromNib
类似于在.NET中反序列化后调用的事件。 viewDidLoad
类似于.NET中的Load
事件。
如果您熟悉.NET中的概念,我认为这应该足够了。
答案 3 :(得分:7)
我将尝试通过举例来回答:
如果定义customCell
类和customCell.xib
文件,然后使用
加载单元格
取消归档xib中的对象时,将调用- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options
, awakeFromNib 。
如果您定义customViewController
,则使用customViewController
创建- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
时。 viewDidLoad 会在加载到视图层次结构中时被调用。
一些相关的混淆方法:
(无效)的loadView;这是子类在不使用nib时应创建自定义视图层次结构的位置。如果未指定nib名称,则loadView将尝试加载名称与视图控制器类相同的nib。如果不存在这样的nib,则必须在调用-view之前调用-setView:或覆盖-loadView方法以编程方式设置视图。永远不应该直接调用-loadView。
(void)viewDidLoad:加载视图后调用。对于在代码中创建的viewControllers,这是在-loadView之后。对于从笔尖取消归档的视图控制器,这是在设置视图之后。
答案 4 :(得分:0)