UIViewController viewDidLoad 与 viewWillAppear: 什么是正确的分工?

我一直有点不清楚的任务类型,应该分配给 viewDidLoadviewWillAppear: 在一个 UIViewController子类。

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

105608 次浏览

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

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

最初只在 tableView 中使用 ViewDidLoad。在失去 Wifi 的测试中,通过将设备设置为飞行模式,实现了表不刷新返回 Wifi。事实上,似乎没有办法刷新设备上的 tableView,即使按下主页按钮,将背景模式设置为 YES In-Info.plist。

我的解决办法是:

-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];}

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

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

目前为一次性 init 和定位我正在考虑使用 viewDidAppear 和一个标志,如果有人有任何其他的建议,请让我知道。

取决于,你需要的数据加载 每个人时,你打开视图? 还是只有 一次

enter image description here

  • 红色: 他们不需要每次都改变,一旦他们装好了,他们还是原来的样子。
  • 紫色: 它们需要随着时间的推移或者在你每次加载之后改变。你不想看到相同的3个建议用户跟随,它需要重新加载每次你回到屏幕上。他们的照片可能会更新... 你不想看到5年前的照片..。

无论你有什么处理,只需要做一次。
viewWilLAppear: 每次加载页面时需要更改的任何处理。

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