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

时间:2008-12-18 08:28:31

标签: cocoa-touch

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

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

5 个答案:

答案 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)

对于ViewController,可以在viewDidLoad()中使用IBOutlets

此处 stackView 表示ViewController中的IBOutlet, stackView 在awakeFromNib中为nil,但是在调用viewDidLoad()时已实例化。

IBOutlets state in awakeFromNib() vs IBOutlet state in viewDidLoad()