166

我一直对应该分配给viewDidLoadvs.的任务类型有点不清楚viewWillAppear:在UIViewController子类中。

例如,我正在做一个应用程序,其中我有一个UIViewController子类访问服务器,获取数据,将其提供给视图,然后显示该视图。viewDidLoad在vs.中这样做的利弊是什么viewWillAppear

4

4 回答 4

253

viewDidLoad 是你必须做一次的事情。每次视图出现时都会调用 viewWillAppear。你应该在 viewDidLoad 中做一些你只需要做一次的事情——比如设置你的 UILabel 文本。但是,您可能希望每次用户查看视图的特定部分时都对其进行修改,例如,每次您进入“正在播放”视图时,iPod 应用程序都会将歌词滚动回顶部。

但是,当您从服务器加载内容时,您还必须考虑延迟。如果您将所有网络通信打包到 viewDidLoad 或 viewWillAppear 中,它们将在用户看到视图之前执行 - 可能导致您的应用程序短暂冻结。首先向用户显示带有某种活动指示器的未填充视图可能是个好主意。当您完成网络时,可能需要一两秒钟(或者甚至可能失败 - 谁知道?),您可以使用您的数据填充视图。在各种 Twitter 客户端中可以看到如何做到这一点的好例子。例如,当您在 Twitterrific 中查看作者详细信息页面时,该视图只会显示“正在加载...”,直到网络查询完成。

于 2009-10-16T18:28:49.313 回答
13

需要注意的是,使用 viewDidLoad 进行定位有点冒险,应该避免,因为没有设置边界。这可能会导致意想不到的结果(我有各种各样的问题......)

这篇文章很好地描述了不同的方法以及每种方法中发生的情况。

目前对于一次性初始化和定位,我正在考虑使用带有标志的 viewDidAppear,如果有人有任何其他建议,请告诉我。

于 2014-06-26T17:49:43.827 回答
12

最初仅将 ViewDidLoad 与 tableView 一起使用。在失去 Wifi 的情况下进行测试,通过将设备设置为飞行模式,发现表格没有随着 Wifi 的返回而刷新。事实上,似乎没有办法刷新设备上的 tableView,即使在 -Info.plist 中将背景模式设置为 YES 时点击主页按钮也是如此。

我的解决方案:

-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];}
于 2012-11-29T20:52:36.377 回答
5

取决于,您是否需要在每次打开视图时加载数据?还是只有一次

在此处输入图像描述

  • 红色:他们不需要每次都改变。一旦它们被加载,它们就会保持原样。
  • 紫色:它们需要随着时间或每次加载后发生变化。您不希望看到相同的 3 个建议用户关注,每次返回屏幕时都需要重新加载。他们的照片可能会更新...您不想看到 5 年前的照片...

viewDidLoad:无论您有什么处理都需要完成一次。
viewWilLAppear:每次加载页面时需要更改的任何处理。

标签、图标、按钮标题或大多数 dataInputedByDeveloper通常不会更改。名称、照片、链接、按钮状态、列表(tableViews 或 collectionView 的输入数组)或大多数 dataInputedByUser通常会发生变化。

于 2016-09-08T16:17:16.500 回答