我习惯将viewWillAppear
和viewDidLoad
中的任意一个放在一起,直到现在都没问题。但是我在思考何时应该将其放入viewWillAppear
,何时应该放入viewDidLoad
中?
我习惯将viewWillAppear
和viewDidLoad
中的任意一个放在一起,直到现在都没问题。但是我在思考何时应该将其放入viewWillAppear
,何时应该放入viewDidLoad
中?
我通常使用的简单规则是这样的。viewDidLoad
是在视图资源加载完成后调用的。此时,视图还未绘制在屏幕上。因此,处理视图几何和可视化的计算与代码不应该放在这里。应该放在viewWillAppear
或viewDidAppear
方法中。
另外,viewWillAppear
可能会被多次调用:
由于这些原因,viewWillAppear
不应包含需要较长时间才能完成的代码(至少不应该运行在主线程上的代码)。也不应包含每个视图显示只需要运行一次的代码。
我相信还有其他规则,但这些很容易记住,希望对你有所帮助。
viewDidLoad: 提示视图已经完成加载
viewWillAppear: 在视图加载之前运行
viewDidLoad
是只需执行一次的任务。 viewWillAppear
每次视图出现时都会被调用。你应该在viewDidLoad
中执行只需一次完成的任务,如设置UILabel
文本。然而,你可能想要每次用户查看特定部分的视图时,修改视图的某个特定部分,例如应用程序每次转到“正在播放”视图时都会将歌词滚动回顶部。
然而,当你从服务器加载数据时,也需要考虑延迟。如果你把所有的网络通信都打包到viewDidLoad
或viewWillAppear
中,它们将在用户看到视图之前被执行-可能导致应用程序短暂冻结。最好的做法是先向用户显示一个未填充的视图和某种类型的活动指示器。当你完成网络操作(这可能需要一两秒钟,甚至可能失败-谁知道?)后,再填充视图。可以在各种Twitter客户端中看到此操作的良好示例。例如,在Twitterrific中查看作者详细信息页面时,视图仅显示“正在加载...”,直到网络查询完成。