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

Posted

技术标签:

【中文标题】iPhone - 使用哪种视图控制器方法【英文标题】:IPhone - Which View Controller methods to use 【发布时间】:2009-08-27 03:20:08 【问题描述】:

我正在试图弄清楚哪些逻辑应该进入不同的 UIViewController 方法,如 viewDidLoad、viewDidAppear、viewWillAppear、...

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

我的主要问题是,人们通常会在 viewDidLoad、.... 方法中放入什么。

目前我:

viewDidLoad - 设置标签栏控制器并将其视图设置为视图控制器自己的视图

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

我现在正试图弄清楚我设置标签栏控制器的逻辑是否应该进入 loadView 而不是 viewDidLoad。

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

【问题讨论】:

【参考方案1】:

您不应同时实现-viewDidLoad-loadView;它们用于不同的目的。如果加载 NIB,则应实现 -viewDidLoad 以执行加载 NIB 后需要完成的任何功能。如果您还没有在 NIB 中完成,那么在此处连接标签栏是合适的。

-loadView 如果您不使用 NIB,则应该实现,并且应该构建视图。

-viewWillAppear 在您出现在屏幕上之前立即被调用。这是设置通知观察的好地方,根据自您上次出现在屏幕上以来发生的更改的模型类更新您的数据,或者在用户看到您之前将您的行为集中起来。您不应该在这里执行任何动画。你不在屏幕上;你不能动画。由于这个错误,我看到了很多动画故障。它有点工作,但看起来很奇怪。

-viewDidAppear 在您进入屏幕后被调用。这是你做任何入口动画的地方(例如,向上滑动一个模式;不是你应该经常这样做,但我只是在看一些这样做的代码)。

-viewWillDisappear 在您离开屏幕之前被调用。在这里您可以执行任何离开动画(包括取消选择表格视图单元格等)。

-viewDidDisappar 在您离开屏幕后调用(并且动画已经完成)。在这里删除任何观察,如果可能的话释放内存,尽可能去睡觉。

我在这里谈到了设置和拆除观察。我会在 View controllers and notifications 中更深入地讨论这个问题。

【讨论】:

因此,如果我没有为根视图控制器使用笔尖,它以编程方式加载选项卡栏控制器,然后将其他根控制器加载到选项卡中,我应该在 loadView 中执行此操作吗?感谢您的帮助。 正确。如果您以编程方式创建视图,则根本不应该使用 -viewDidLoad。 @mahboudz:是的;我跳过了那个。 -viewDidUnload 是 3.0 中的新功能,是发布您保留的任何 IBOutlets 的地方(并且您应该保留您的 IBOutlets)。在 2.x 中,我们必须在 setView 中执行此操作:基于 Apple 必须半记录的实现细节,因为没有它您将无法正确管理内存。幸运的是 -viewDidUnload 解决了所有这些问题。 3.0 万岁。【参考方案2】:

viewDidLoad 将在每个 UIViewController 的视图的每个生命周期中调用一次。您将需要在用户开始与视图交互之前设置和工作的东西放在那里。

viewDidAppear 在视图出现在用户面前时被调用。它可能会被多次调用。一个示例是使用UINavigationController 推送和弹出视图层次结构的应用程序的根屏幕。把你每次都想做的东西放在那里。例如,您可能希望隐藏根屏幕的UINavigationBar,但对所有子屏幕显示它,因此您需要在此处隐藏栏。

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

关于您的应用,您是否有理由不将 UITabViewController 设置为您的应用委托加载的控制器?您的应用程序中似乎有一个您可能需要也可能不需要的间接级别。现在简化它可能会更好,如果您需要更复杂的东西,稍后再重构。

【讨论】:

viewDidLoad 在 UIViewController 的生命周期中可以被多次调用。如果在基于 NIB 的控制器上调用 -setView:nil(在默认的 -didReceiveMemoryWarning 期间发生),则下次调用 -view 时,将再次调用 -viewDidLoad。误解这一点可能会导致非常难以理解的错误。 我一直在玩这个间接。我试图弄清楚我的视图控制器的“最佳”设置是什么。原因是我不确定我可能会加载哪些其他视图。最终我可能想要一个加载屏幕,所以我的想法是我有我的根视图控制器,它会决定我是否需要显示其他东西。如果它需要显示加载屏幕,它会加载它。这是我的第一个真正的大型应用程序,我只是想找到一个好的结构。我试图通过将所有应用程序逻辑放在视图控制器中来避免在应用程序委托中投入太多 我的根视图控制器也没有笔尖,因为我希望它能够显示其他视图。它基本上会查看应用程序的状态,并会显示需要什么。也许我应该重新审视我的观点,看看是否有必要这样做。我只是不想让自己陷入一个以后必须改变的洞。也许这不是要走的路。任何建议都会很棒。

以上是关于iPhone - 使用哪种视图控制器方法的主要内容,如果未能解决你的问题,请参考以下文章

未调用 iphone 视图控制器方法但视图显示

在视图初始化之前调用视图控制器中的方法 - iPhone iOS 5 SDK

Iphone UIView 父方法调用

iPhone - 删除整个 viewController,而不仅仅是它的视图

在 iPhone 上显示 UISplitViewController 的详细视图控制器

iPhone - Page Scroll View Help,停止不同的视图控制器分配