1

我有一个有点复杂的视图,我将它放在一个单独的(基于视图的模板)项目中(视图控制器在 MainWindow.xib 中用橙色图标表示)。现在已经够远了,我决定将它移到另一个项目中,它将由导航控制器管理。它是从 UINavigationController 相当简单的pushViewController: animated:方法调用的。

MyViewController 有一个相应的 nib 文件(也许我的一些困惑是类和 nib 的名称几乎相同,只是后缀 .m、.h 和 .xib 不同)。当这是在初始项目中启动时的初始视图时,实例化时将调用awakeFromNibinitWithCoder 。现在似乎 只有viewDidLoad被调用了。

我对什么/为什么会有这样的差异感到困惑?!?我在 SO 上找到了一些其他相关的线程,但它们仍然让我摸不着头脑,回答如下: “当控制器本身从 nib 取消归档时调用 awakeFromNib。创建/取消归档视图时调用 viewDidLoad。这个当控制器的视图存储在单独的 nib 文件中时,区别尤其重要。”

区别似乎取决于什么,确切地说,正在取消归档 ViewViewController。因此,如果 ViewController 正在被实例化并被推送,那么我应该只期望 viewDidLoad 被调用?另一方面,如果我的 ViewController 有一个 IBOutlet(以及一个表示它的对象 VC 对象已被拖到我的 Nib 中),那么我可以期望 initWithCoder 和 awakeFromNib 都被调用?

有人可以帮我纠正一下吗?如果在非常具体的情况下任意调用不同的方法,似乎更难以重用这些视图/控制器......或者,当然是这样,这正是它们被调用的原因,而不是非常具体的情况......我只是还不完全理解每种方法之间的划分。

有人愿意帮助我纠正吗?

4

1 回答 1

2

区别似乎取决于什么,确切地说,正在取消归档 View 或 ViewController。因此,如果 ViewController 正在被实例化并被推送,那么我应该只期望 viewDidLoad 被调用?另一方面,如果我的 ViewController 有一个 IBOutlet(以及一个表示它的对象 VC 对象已被拖到我的 Nib 中),那么我可以期望 initWithCoder 和 awakeFromNib 都被调用?

这是你误入歧途的地方。这与 ViewController 是否有 IBOutlet 无关。ViewController 是否在 NIB 中实例化决定是否-awakeFromNIB被调用。

根据您的描述,我将它放在您的代码中的某个地方,您有这样的东西:

MyViewController *vc = [[MyViewController alloc] init]; // (or initWithNibName:bundle:)
[navController pushViewController:vc animated:YES];
[vc release];

如果是这样,则 NIB 没有实例化 MyViewController。你的代码是。因此-awakeFromNib不会被调用。您没有从 NIB 中醒来。

您可能想要做的是在您的 NIB 中展开导航控制器(切换到列表视图;左上角的视图模式按钮集中的中间按钮)。在那里你会看到根视图控制器。默认情况下它是一个 UIViewController。如果你希望根控制器是 MyViewController,你应该改变它的类。在这种情况下,您会接到一个-awakeFromNib电话,因为它将是创建此对象的 NIB。然后,您当然应该摆脱任何同时实例化它并将其放在 NavController 上的代码。

于 2009-07-22T03:47:42.530 回答