awakeFromNib没有调用但是显示了xib

时间:2012-12-05 18:19:24

标签: iphone objective-c ios nib awakefromnib

我在xcode 4.5中创建了一个新项目,我通过

调用了我的viewcontroller

- (ID)initWithNibName:束:

来自appdelegate的

,因为它在默认项目模板中调用,我不使用storyboard 但没有调用awakeFromNib 我也搜索过但无法理解为什么 awakeFromNib 没有调用。

通过-(void)awakeFromNib的Apple文档 “从Interface Builder存档或nib文件加载后,准备接收器以进行服务。” “初始化符合NSCoding协议的对象(包括UIView和UIViewController的所有子类) 使用他们的initWithCoder:方法。所有不符合的对象 使用init方法初始化NSCoding协议。在实例化所有对象之后 初始化后,nib加载代码重新建立所有这些对象的插座和操作连接。然后呢 调用对象的awakeFromNib方法。“

我的问题是为什么awakeFromNib在加载xib文件时没有调用? 我做错了吗?请详细说明

2 个答案:

答案 0 :(得分:11)

awakeFromNib:仅当视图控制器在nib文件中时才会被调用。
在这种情况下,使用init initWithNibName:bundle初始化视图控制器,因此视图控制器的内容位于nib内,而不是视图控制器本身
如果打开xib文件,在xib中拖动一个对象并将该类设置为视图控制器类名,然后将调用awakeFromNib(这种情况下,您不需要手动初始化视图控制器)。
因此,请记住在xib文件中使用视图控制器,使视图控制器不在xib文件中,而是从xib文件加载所有内容之间的区别。

PS: 我可以互换地使用nib和xib。

修改
我忘了告诉你如何解决这个问题.Override viewDidLoad用初始化的插座做事。

答案 1 :(得分:2)

为什么不直接将 - (id)initWithNibName:bundle:方法添加到子类而不是 - (void)awakeFromNib?

我的“awakeFromNib”方法调用得很好,但我加载了我的视图控制器:

myViewController *vc = [[[NSBundle mainBundle] loadNibNamed:@"myViewController" owner:self options:nil] objectAtIndex:0];

所以我想知道你的awakeFromNib是否因为你正在使用initWithNibName而被调用?

编辑:我刚刚看到你的评论,你正在将awakeFromNib添加到由XCode创建的默认项目的ViewController中。在创建项目时,是否取消选中“使用StoryBoard”框?如果您的笔尖位于项目的主要故事板内,则可能需要一些额外的环节。