6

我在 xcode 4.5 中创建了一个新项目,并通过以下方式调用了我的视图控制器

-(id)initWithNibName:bundle:

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

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

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

4

2 回答 2

11

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

PS: 我交替使用nib和xib。

编辑
我忘了告诉你如何解决这个问题。覆盖 viewDidLoad 来处理初始化的插座。

于 2012-12-05T18:39:25.693 回答
2

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

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

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

所以我想知道是否因为您使用的是 initWithNibName 而没有调用您的 awakeFromNib ?

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

于 2012-12-05T19:21:26.680 回答