我有一个复杂的视图,我把它放在一个单独的(基于视图的模板)项目中(View Controller在MainWindow.xib中用橙色图标表示)。现在已经足够了,我已经决定将它移动到另一个项目中,它将由导航控制器管理。它是从UINavigationController的相当简单的 pushViewController:animated:方法调用的。
MyViewController有一个相应的nib文件(也许我的一些困惑是类和nib几乎完全相同,只有后缀.m,.h,& .xib不同)。如果这是初始项目中启动的初始视图,则在实例化时将调用 awakeFromNib 和 initWithCoder 。现在只有 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被调用吗?
有人可以帮我帮忙吗?如果在非常特殊的情况下任意调用不同的方法,那么重用这些视图/控制器似乎更难......或者,当然,这正是为什么它们被调用,而不是,非常具体的情况......我还没有完全理解各种方法之间的划分。
有人愿意帮我解决问题吗?
答案 0 :(得分:2)
区别似乎是依赖的 什么,确切,正在被取消归档 View或ViewController。因此,如果 ViewController正在 实例化并推送然后我应该 只希望调用viewDidLoad? 而另一方面,如果我的 ViewController有一个IBOutlet(和一个 对象VC对象表示它 已被拖入我的笔尖)然后我 可以期待initWithCoder和 awakeFromNib都被调用了?
这是你误入歧途的地方。这不是ViewController是否具有IBOutlet。是否在NIB中实例化ViewController,确定是否调用-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上。