2009-10-16 51 views
146

我一直对应分配给viewDidLoadviewWillAppearUIViewController子类别的任务类型有点不清楚。UIViewController viewDidLoad vs. viewWillAppear:什么是正确的分工?

例如我正在做一个应用程序,我有一个UIViewController子类访问服务器,获取数据,将其提供给视图,然后显示该视图。 viewDidLoadviewWillAppear做这件事有什么优点和缺点?

回答

236

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

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

+0

因此,关于viewWill可能会被重复调用。例如,如果视图控制器视图在被隐藏之后变得可见(我的意思是这里被遮挡,而不是UIView上的隐藏方法),那么该方法会触发吗?在没有调用viewDidLoad之前,什么样的scenerio会被调用? – dugla 2009-10-16 19:40:21

+5

viewDidLoad只在构造视图时被调用 - 例如在视图控制器initFromNibNamed在视图被访问时调用之后。 viewWillAppear在您的视图控制器不在视图中而是在视图中时调用 - 因此,当您按下视图控制器时,将调用viewWillAppear。如果您从那里推入另一个子视图,并且用户返回,则再次调用viewWillAppear。 – 2009-10-16 19:52:59

+0

谢谢肯德尔。是的,一些策略性放置的NSLog让我分类。 viewWillAppear/viewWillDissappear触发视图控制器推/弹出。 – dugla 2009-10-16 20:01:49

11

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

我的解决办法:

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

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

This post很好地描述了不同的方法,以及在他们每个人中会发生什么。

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

+0

同意这一点:“...应该避免,因为边界没有设置......” – danisupr4 2016-01-07 13:56:38

3

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

enter image description here

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

viewDidLoad:无论处理你需要做一次。
viewWilLAppear:无论在每次加载页面时需要更改哪些处理。

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

相关问题