iPhone - 使用哪些视图控制器方法

3

我正在研究在UIViewController的不同方法中应该放置什么逻辑,例如viewDidLoad,viewDidAppear,viewWillAppear等。

我的应用程序结构是,我有一个根视图控制器,它实际上没有自己的视图,而是有一个选项卡视图控制器并将其他视图控制器加载到其中。但是在将来,根据应用程序逻辑,它可能需要加载其他视图控制器而不是选项卡视图控制器。

我的主要问题是,人们通常把什么放入viewDidLoad等方法中。

目前我这样做:

viewDidLoad - 设置选项卡视图控制器并将其视图设置为视图控制器自己的视图

viewDidAppear - 检查用户是否存储了登录信息 如果没有- 登录 如果有,登录并获取第一个选项卡的应用程序数据

现在我正在尝试弄清楚我设置选项卡视图控制器的逻辑是否应该放在loadView而不是viewDidLoad中。

任何帮助都将非常棒。在网上找到的小例子很棒,但它们没有详细说明应如何构建大型应用程序。

2个回答

3
您不应同时实现-viewDidLoad-loadView方法,它们有不同的用途。如果您加载了一个NIB文件,那么您应该实现-viewDidLoad方法,在加载NIB文件后执行任何需要完成的功能,例如在那里连接选项卡栏(如果您尚未在NIB中完成)。
如果您不使用NIB文件,则应该实现-loadView方法,并构建视图。 -viewWillAppear方法会在您即将显示在屏幕上时立即调用。这是设置通知观察、根据模型类更新数据以及在用户看到之前做好准备的好地方。您不应在此处执行任何动画。因为您还没有出现在屏幕上,所以无法进行动画。我经常看到由于这个错误而导致的动画故障。它似乎可以工作,但看起来很奇怪。 -viewDidAppear方法会在您显示在屏幕上之后调用。这是您执行任何入口动画的地方(例如,向上滑动一个模态视图;虽然您不应该经常这样做,但我刚刚看了一些代码)。 -viewWillDisappear方法会在您从屏幕上消失之前调用。这是您可以执行任何离开动画的地方(包括取消选择表格视图单元等)。 -viewDidDisappar方法会在您从屏幕上消失之后(并且动画已经完成)调用。在这里撤销任何观察,如果可能的话释放内存,并尽可能休眠。
我提到了设置和撤销观察的内容。我会在视图控制器和通知中更深入地介绍它们。

所以,如果我没有使用Nib文件来加载根视图控制器,而是通过编程方式加载一个标签栏控制器,然后将其他根控制器加载到标签中,那么我应该在loadView方法中完成这个过程吗?感谢您的帮助。 - Brian
1
正确。如果您以编程方式创建视图,则根本不应使用-viewDidLoad。@mahboudz:是的;我跳过了那个。-viewDidUnload在3.0中是新功能,是释放任何IBOutlets(您应该保留您的IBOutlets)的地方。在2.x中,我们必须基于实现细节在setView:中执行此操作,因为您无法正确地进行内存管理而必须半文档化。幸运的是,-viewDidUnload解决了所有这些问题。为3.0喝彩。 - Rob Napier

0

viewDidLoad 会在每个 UIViewController 的生命周期中被调用一次。您可以在其中放置需要在用户开始与视图交互之前设置和工作的内容。

viewDidAppear 在视图已经出现给用户时被调用。它可能会被调用多次。例如,一个应用程序的根屏幕使用 UINavigationController 来推送和弹出视图层次结构。您可以在这里放置每次都需要完成的内容。例如,您可能想要隐藏根屏幕的 UINavigationBar,但对于所有子屏幕都显示它,因此您可以在此处隐藏该栏。

因此,您应该将设置您的 UITabBarController 的逻辑放在 viewDidLoad 中,因为它只需要执行一次。

关于您的应用程序,您是否有理由不直接使 UITabViewController 成为应用程序委托加载的控制器?您的应用程序似乎存在一定程度的间接性,您可能需要或不需要。如果您需要更复杂的东西,最好现在简化它,以后再进行重构。


1
viewDidLoad可以在UIViewController的生命周期中被多次调用。如果在基于NIB的控制器上调用-setView:nil(这在默认的-didReceiveMemoryWarning期间会发生),下一次调用-view时,-viewDidLoad将再次被调用。对此的误解可能导致非常难以理解的错误。 - Rob Napier
我已经玩了一段时间这个间接引用。我正在试图找出我的视图控制器的“最佳”设置是什么。原因是我不确定我可能会加载什么其他视图。最终,我可能需要一个加载屏幕,所以想法是我会有我的根视图控制器,它会决定是否需要显示其他东西。如果需要显示加载屏幕,它会加载它。这是我的第一个真正的大型应用程序,我只是在尝试找到一个好的结构。我试图避免把太多逻辑放在应用代理中,而是把所有应用逻辑放在视图控制器中。 - Brian
我也没有为我的根视图控制器准备一个nib文件,因为我希望它能够显示其他视图。它基本上会查看应用程序的状态并显示所需的内容。也许我应该重新审视我的视图,看看是否有这个需要。我只是不想陷入以后必须更改的困境中。也许这不是正确的方法。任何建议都将非常好。 - Brian

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