UIViewController的viewDidLoad中主场迎战viewWillAppear中:什

2019-08-19 07:10发布

我一直对应分配给的任务类型有点不清楚viewDidLoad主场迎战viewWillAppear :在UIViewController子类。

例如,我在做一个应用,在那里我有一个UIViewController子类,创下了服务器,获取数据,将其送入一个视图,然后显示了这一观点。 什么是这样做的利弊viewDidLoad主场迎战viewWillAppear

Answer 1:

viewDidLoad中的事情,你必须做一次。 viewWillAppear中被调用每一个出现的查看时间。 你应该做的事情,你只需要在viewDidLoad中做一次 - 如设置你的UILabel文本。 但是,您可能希望每个用户获取,查看它的时间来修改视图的特定部分,例如每你到“正在播放”视图时的iPod应用程序滚动歌词重回巅峰。

然而,当你从服务器加载的东西,你也必须考虑延迟。 你如果把你所有的网络通信到viewDidLoad中或viewWillAppear中,他们将被执行的用户获取查看视图之前 - 这可能导致你的应用程序的短冻结。 这可能是好主意,首先显示用户用某种活动指示器的无人居住的视图。 当你与你的网络,这可能需要一两秒钟(?甚至可能失败 - 谁知道)进行填充,您可以用您的数据视图。 如何可以这样做很好的例子可以在各种Twitter客户端中可以看出。 例如,当您查看Twitterrific笔者详细信息页面,视图只是说“载入中...”直到网络查询已经完成。



Answer 2:

最初仅用于viewDidLoad中使用的tableView。 在与WiFi的损耗测试,通过设置设备飞行模式,实现了该表没有与WiFi的回报刷新。 事实上,似乎没有办法刷新的tableView设备上甚至击中中-Info.plist设置为YES背景模式的主页按钮。

我的解决方案:

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


Answer 3:

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

这篇文章非常好地描述了不同的方法和发生的事情在他们每个人。

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



Answer 4:

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

  • 红色:它们不需要改变每一次。 一旦他们被加载他们留下,因为他们是如何。
  • 紫:他们需要随时间而改变,或者你每次加载后。 你不希望看到同样的3建议用户遵循,它需要你每次回来到屏幕上时加载。 他们的照片可能会更新中...你不希望看到从5年前的照片...

viewDidLoad:无论处理你需要做一次。
viewWilLAppear:无论是需要改变的每个页面加载时间处理。

标签,图标,按钮,标题或最dataInputedByDeveloper 通常不会改变。 姓名,照片,链接,按钮状态,列表(输入阵列为您tableViews或的CollectionView)或最dataInputedByUser 通常不会改变。



文章来源: UIViewController viewDidLoad vs. viewWillAppear: What is the proper division of labor?