UIViewController viewDidLoad vs. viewWillAppear(什么是适当的分工())
行是知之始,知是行之成。这篇文章主要讲述UIViewController viewDidLoad vs. viewWillAppear:什么是适当的分工?相关的知识,希望能为你提供帮助。
我一直有点不清楚应该分配给viewDidLoad
与viewWillAppear
的任务类型:在UIViewController
子类中。
例如我正在做一个应用程序,我有一个UIViewController
子类命中服务器,获取数据,将其提供给视图,然后显示该视图。在viewDidLoad
与viewWillAppear
中这样做的优点和缺点是什么?
答案viewDidLoad是你必须做的事情。每次出现视图时都会调用viewWillAppear。您应该在viewDidLoad中执行一次只需要执行的操作 - 例如设置UILabel文本。但是,您可能希望每次用户查看视图的特定部分时修改视图的特定部分,例如每次进入“正在播放”视图时,iPod应用程序都会将歌词滚动回到顶部。
但是,当您从服务器加载东西时,您还必须考虑延迟。如果将所有网络通信打包到viewDidLoad或viewWillAppear中,它们将在用户看到视图之前执行 - 可能导致应用程序的短暂冻结。首先向用户显示具有某种活动指示符的未填充视图可能是个好主意。当您完成网络时,可能需要一两秒钟(或者甚至可能会失败 - 谁知道?),您可以使用您的数据填充视图。在各种Twitter客户端中可以看到关于如何做到这一点的好例子。例如,当您在Twitterrific中查看作者详细信息页面时,视图仅显示“正在加载...”,直到网络查询完成。
另一答案最初只使用带有tableView的ViewDidLoad。在测试失去Wifi时,通过将设备设置为飞行模式,意识到表没有刷新Wifi的返回。事实上,即使在-Info.plist中将后台模式设置为YES的主页按钮,似乎也无法在设备上刷新tableView。
我的解决方案
-(void) viewWillAppear: (BOOL) animated { [self.tableView reloadData];
}
另一答案重要的是要注意使用viewDidLoad进行定位有点冒险,应该避免,因为没有设置边界。这可能会导致意想不到的结果(我有各种各样的问题...)
This post很好地描述了不同的方法以及每种方法中发生的事情。
目前一次初始化和定位我正在考虑使用带有标志的viewDidAppear,如果有人有任何其他建议请告诉我。
另一答案取决于,每次打开视图时是否需要加载数据?还是只有一次?
文章图片
- 红色:它们不需要每次都改变。一旦它们被装载,它们就像它们一样。
- 紫色:他们需要随着时间的推移或每次加载后更改。您不希望看到相同的3个建议用户,每次返回屏幕时都需要重新加载。他们的照片可能会更新......你不想看到5年前的照片......
viewDidLoad:
无论你有什么处理,都需要做一次。
viewWilLAppear:
每次加载页面时都需要更改的处理。【UIViewController viewDidLoad vs. viewWillAppear(什么是适当的分工())】标签,图标,按钮标题或大多数dataInputedByDeveloper通常不会更改。名称,照片,链接,按钮状态,列表(tableViews或collectionView的输入数组)或大多数dataInputedByUser通常会更改。
推荐阅读
- 是否可以在不使用继承的情况下在viewDidAppear上调用某些代码
- Swift - 从viewController访问AppDelegate窗口
- mcapply(所有计划的核心在用户代码中遇到错误)
- Android studio ConstraintLayout大小调整问题
- 使用具有目的为“ android.rfid.INPUT”的意图的sendBroadcast
- App Engine模块之间的快速通信方式
- Unity IAP在Apple Testflight中不起作用
- 未找到模块'apple_sign_in'
- 如何使用C语言中的星号打印带有对角线的空心方形/矩形/矩形图案