当前位置:  开发笔记 > 运维 > 正文

UIViewController viewDidLoad vs. viewWillAppear:什么是适当的分工?

如何解决《UIViewControllerviewDidLoadvs.viewWillAppear:什么是适当的分工?》经验,为你挑选了3个好方法。

我一直对应分配给的任务类型有点不清楚viewDidLoad对比viewWillAppear:在一个UIViewController子类.

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



1> 小智..:

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

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


viewDidLoad ONLY在构造视图时被调用 - 例如在访问视图时视图控制器initFromNibNamed调用之后.当视图控制器不在视图中但进入视图时,会调用viewWillAppear - 因此在推送视图控制器时,将调用viewWillAppear.如果从那里推送另一个子视图,并且用户返回,则再次调用viewWillAppear.
请注意,如果视图被隐藏,然后因内存相关原因而被卸载,则会再次调用viewDidLoad,然后重新出现.您可以依赖的内容:viewDidLoad将在首次创建视图时被调用为AT LEAST ONCE,并且在隐藏后再次出现视图时可能会被调用多次.当视图即将出现在屏幕上时,将始终调用viewWillAppear.
有人可以进一步评论这两个相关的问题:(1)有时,并非总是如此,控制的框架值(即原点和大小)在viewDidLoad中为零,有时不是 - 为什么?(2)在Apple的splitViewController的detailView(iPad)模板中,有一个configureView方法 - 相对于viewDidLoad和ViewWillAppear应该有哪些内容?

2> 小智..:

最初只使用带有tableView的ViewDidLoad.在测试失去Wifi时,通过将设备设置为飞行模式,意识到表没有刷新Wifi的返回.事实上,即使在-Info.plist中将后台模式设置为YES的主页按钮,似乎也无法在设备上刷新tableView.

我的解决方案

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



3> keisar..:

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

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

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

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有