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

我一直都不清楚应该分配给viewDidLoadviewWillAppear的任务types:在UIViewController子类中。

例如,我正在做一个应用程序,我有一个UIViewController子类访问服务器,获取数据,喂给一个视图,然后显示该视图。 viewDidLoadviewWillAppear什么viewWillAppear

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

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

希望能帮助你一点,

莱昂

最初只与ViewView一起使用ViewDidLoad。 在testing失败的Wifi时,通过将设备设置为飞行模式,意识到表没有刷新Wifi的返回。 实际上,即使通过在-Info.plist中将背景模式设置为YES按下主页button,似乎也无法刷新设备上的tableView。

我的解决scheme

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

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

这篇文章很好地描述了不同的方法,以及在每个方法中发生了什么。

目前为一次初始化和定位我想用viewDidAppear与国旗,如果任何人有任何其他build议,请让我知道。

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

在这里输入图像描述

  • 红色:他们不需要每次都改变。 一旦他们被装载,他们保持原样。
  • 紫色:他们需要随着时间的推移或每次加载之后进行更改。 您不希望看到相同的3个build议用户关注,每次回到屏幕时都需要重新加载。 他们的照片可能会更新…你不想看到5年前的照片…

viewDidLoad:无论你需要做什么处理。
viewWilLAppear:无论每次加载页面时需要更改的处理。

标签,图标,button标题或大多数dataInputedByDeveloper 通常不会更改。 名称,照片,链接,button状态,列表(为您的tableViews或collectionViewinput数组)或大多数dataInputedByUser 通常会改变。