我最近在我的应用程序中遇到了一个问题,我在UIViewController子类的-awakeFromNib
方法中创建的一些子视图正 从视图中消失.经过一番探索之后,我发现移动我输入的代码-awakeFromNib
来-viewDidLoad
解决问题.-awakeFromNib
当UIViewController从nib中取消归档时,似乎只调用一次,并且-viewDidLoad
每次取消归档视图时都会调用它.
那么最佳做法是什么?看起来UIViewController -awakeFromNib
不应该向视图添加任何视图,应该完成那种东西-viewDidLoad
.我理解正确吗?还是我比我想的更困惑?
awakeFromNib
当控制器本身从笔尖取消归档时调用.viewDidLoad
在创建/取消存档视图时调用.当控制器的视图存储在单独的nib文件中时,这种区别尤为重要.
同样重要的是,awakeFromNib
从内存警告恢复后永远不会调用该函数.但是,该viewDidLoad
函数将被调用.
是的,这是对的.你不应该真的依赖于awakeFromNib
做那种任务.
awakeFromNib
类似于在.NET中反序列化后调用的事件.viewDidLoad
类似于Load
.NET中的事件.
如果您熟悉.NET中的概念,我认为这应该足够了.
我将尝试通过举例来回答:
如果定义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取消归档的视图控制器,这是在设置视图之后.