initWithNibName方法没有被调用

7

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

我从第一天开始构建整个iPhone应用程序,并且使用每个选项卡中的标准导航控制器和选项卡控制器。

所以我实现了:

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

但是发现它没有被调用。(我在其中设置了断点和日志记录语句,但没有任何命中)。

有人知道为什么吗?或者我如何实现这个功能?

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

2个回答

7

如果在将其添加到导航控制器之前,您没有像这样执行以下操作:

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

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

如果你的视图控制器存在于一个nib文件中,比如说你的导航控制器的nib文件,它将会作为一个新的视图控制器对象从nib文件中解档出来,而不是使用自己的nib文件创建,所以上述方法不会被调用。

你需要覆盖-awakeFromNib方法。


好的,我明白了,谢谢。那么我该如何从这个方法中选择XIB呢? - Mark
选择xib是什么意思? - BoltClock
我想根据设备是iPad还是iPhone使用不同的XIB文件,我该如何实现? - Mark
啊,很抱歉我不熟悉通用应用程序,所以无法帮助你,抱歉 :/ - BoltClock
1
没问题,我已经知道如何做了...
  1. 将目标更新为单一通用应用程序。
  2. 注意 Xcode 为您创建的新 XIB 文件 XXX-iPad.xib。
  3. 创建相应于您的 iPad 应用程序的新 XIB 文件(您可以创建指向现有 UIViewController 的新 XIB 文件,只需添加一个“View XIB”,将其类更改为现有视图控制器)。
  4. 在该 XIB 文件中,更改加载常规 XIB 文件以指向步骤 3 中创建的新 XIB 文件。
  5. 像在新 XIB 中一样正常连接 IBOutlet。
- Mark
子类化视图。一个用于iPad,一个用于iPhone。 - Septiadi Agus

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接