我在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文件时没有调用? 我做错了吗?请详细说明
答案 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”框?如果您的笔尖位于项目的主要故事板内,则可能需要一些额外的环节。