awakeFromNib 没有调用但显示 xib

Posted

技术标签:

【中文标题】awakeFromNib 没有调用但显示 xib【英文标题】:awakeFromNib is not calling but displaying xib 【发布时间】:2012-12-05 18:19:23 【问题描述】:

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

调用了我的视图控制器

-(id)initWithNibName:bundle:

来自 appdelegate,因为它在默认项目模板中调用,我没有使用故事板 但没有调用 awakeFromNib 我也搜索过,但不明白为什么 awakeFromNib 没有打电话。

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

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

【问题讨论】:

代码与默认项目模板相同,我刚刚在视图控制器中添加了 awakeFromNib 【参考方案1】:

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

PS: 我交替使用 nib 和 xib。

编辑 我忘了告诉你如何解决这个问题。覆盖 viewDidLoad 以使用初始化的 outlet 执行操作。

【讨论】:

但苹果文档应该调用它,因为它有 xib 并且 xib 未归档和加载。 Apple 文档说:“从 Interface Builder 存档或 nib 文件加载接收器后,准备接收器进行服务。”。您的视图控制器尚未从 nib 文件加载。打开您的nib 文件,您将看不到视图控制器实例。 我认为 Ramy Al Zuhouri 是对的:initWithNibName 创建 视图控制器并将 nib 文件与控制器关联。控制器 view 在需要时从 nib 文件中加载。 感谢您的回复。我毫不怀疑我的 viewcontroller 对象类(在 xib 中)与我的 fileowner 相同,并且工作正常。这怎么可能?你能请稍微解释一下? 默认情况下,在基于视图的应用程序中,视图控制器类中 xib 的文件所有者。问题是 Apple 的文档不太清楚说明文件所有者是什么,请阅读此处:crazyviraj.blogspot.it/2009/05/… 【参考方案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”框?如果您的 nib 位于项目的主情节提要内,则可能需要跳过一些额外的环节。

【讨论】:

在你知道的 initWithNibName 方法中,所有从 xib 加载的视图都还没有初始化。所以他可能想使用 awakeFromNib 因为他需要处理为 xib 文件检索的所有内容。为此,他可以使用 viewDidLoad。 @Ramy Al Zuhouri 感谢您提到 viewDidLoad 我已经忘记了我在做什么,我错过了显而易见的事情!

以上是关于awakeFromNib 没有调用但显示 xib的主要内容,如果未能解决你的问题,请参考以下文章

initWithFrame 未调用,但 awakeFromNib 是

Cocoa - awakeFromNib 没有被调用

awakeFromNib() 调用了两次

在 awakeFromNib 上调用 UIView animate withDuration 不会执行动画

以编程方式加载 nib2 时,来自 nib1 的 awakeFromNib 被调用

init 和 awakeFromNib