将我的 viewController 移到 NavController 下,现在 awakeFromNib 和 initWithCoder 不会触发?

Posted

技术标签:

【中文标题】将我的 viewController 移到 NavController 下,现在 awakeFromNib 和 initWithCoder 不会触发?【英文标题】:Moved my viewController under a NavController and now awakeFromNib and initWithCoder don't fire? 【发布时间】:2009-07-21 23:49:53 【问题描述】:

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

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

我对什么/为什么会有这样的差异感到困惑?!?我在 S.O. 上找到了一些其他线程。这些是相关的,但它们仍然让我摸不着头脑,回答如下:"awakeFromNib is called when the controller itself is unarchived from a nib. viewDidLoad is called when the view is created/unarchived. This distinction is especially important when the controller's view is stored in a separate nib file."

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

有人可以帮我纠正一下吗?如果在非常特定的情况下任意调用不同的方法,似乎更难重用这些视图/控制器......或者,当然是这样,这正是为什么调用它们,而不是,非常具体的情况..我还没有完全理解各种方法之间的描述。

有人愿意帮我纠正一下吗?

【问题讨论】:

【参考方案1】:

区别似乎是依赖的 确切地说,正在取消归档的内容 视图或视图控制器。因此,如果 ViewController 正在 实例化并推送然后我应该 只期望 viewDidLoad 被调用? 另一方面,如果我的 ViewController 有一个 IBOutlet(和一个 object 代表它的 VC 对象 已被拖入我的笔尖)然后我 可以期待 initWithCoder 和 awakeFromNib 都被调用?

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

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

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 上的代码。

【讨论】:

它实际上是被调用的:MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];虽然你说的有道理......虽然想知道它是否仍然适用于我的情况? 是的,完全一样。请注意上面第一行代码中的注释。 initWithNibName:bundle: 在这种情况下与 init 相同。

以上是关于将我的 viewController 移到 NavController 下,现在 awakeFromNib 和 initWithCoder 不会触发?的主要内容,如果未能解决你的问题,请参考以下文章

将我的 NSManagedObject 子类与我的 ViewController.swift 连接起来

JS JQ 帮我改改这实现鼠标移到新增CSS样式

ViewController 关闭 swift ios

如何让我的 NAV 文本在悬停时停止移动?

如何将我的新视图添加到情节提要?

`<nav>` 和 `<center>` 中的下拉菜单未居中