initWithNibName 没有被调用

Posted

技术标签:

【中文标题】initWithNibName 没有被调用【英文标题】:initWithNibName is not getting called 【发布时间】:2010-09-07 23:18:26 【问题描述】:

我需要将一些自定义逻辑放入我的 iPhone 应用程序中,以便根据您运行的 ios 版本选择不同的 XIB 文件(即 iPhone 或 iPad 将显示不同的 XIB 文件)。

我从第一天开始就构建了整个 iPhone 应用程序,而且一切都很好,在每个选项卡中使用了一个 tabbarcontroller 和标准导航控制器。

所以我实现了:

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle

方法,才发现它没有被调用。 (我有一个断点和日志语句,什么都没有命中)。

有人知道为什么会这样吗? 或者我怎样才能实现这个功能?

我在某处读到 initWithNibName 仅在您调用它时才被调用,即当您以编程方式构建视图层次结构时,这是真的吗??

【问题讨论】:

【参考方案1】:

如果您在将其添加到导航控制器之前没有做这样的事情:

SomeViewController *someViewController = [[SomeViewController alloc] initWithNibName:...];

那么很有可能你覆盖了错误的方法。

如果您的视图控制器位于 nib 文件中,例如导航控制器的 nib 文件,它将作为新的视图控制器对象从 nib 文件中解压缩,而不是使用自己的 nib 文件创建,因此上述方法获胜'不会被调用。

您必须改写-awakeFromNib

【讨论】:

好的,我明白了,谢谢,那么我如何从该方法中选择 XIB? 选择xib是什么意思? 嗯,我想要不同的 XIB 文件,具体取决于我是在 iPad 还是 iPhone 上运行,我怎么能做到这一点? 啊,好吧,恐怕我对通用应用程序不熟悉,所以我无法为您提供帮助,抱歉:/ 没关系,我已经找到了方法... 1. 将您的目标更新为单个通用应用程序 2. 记下 xcode 创建的新 XIB 文件 XXX-iPad.xib为您 3. 创建与您的 iPad 应用程序相对应的新 XIB 文件(您可以创建指向现有 UIViewController 的新 XIB 文件,只需添加一个“View XIB”,将其类更改为您现有的视图控制器) 4. 在里面XIB 文件,将加载的正常 XIB 文件更改为指向您在步骤 3 中创建的新 XIB 文件 5. 连接您的 IBOutlet,就像您通常在新 XIB 中一样【参考方案2】:

如果您的视图控制器是从 .xib 文件加载的,则将改为调用 initWithCoder:initWithNibName:bundle: 方法仅用于以编程方式创建视图控制器。

【讨论】:

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

viewDidLoad与initWithNibName的调用时机

UIPopoverPresentationController不调用UIAdaptivePresentationControllerDelegate方法

awakeFromNib 没有调用但显示 xib

我啥时候需要调用 -[UIViewController initWithNibName:bundle:]?

手动加载 nib 文件时未调用 init 或 initWithNibName

initWithNibName 调用了两次或加载了错误的 xib