您的位置:首页 > 移动开发

让UIViewController中的viewDidLoad和viewWillAppear各司其责

2016-06-15 11:14 447 查看
注:本文由破船译自:thejoeconwayblog
 
你是否有过这样的感觉:有时某些代码是放到viewDidLoad还是viewWillAppear:中,这很容易让人混淆。在Stack
Overflow上经常会遇到这样的问题:viewDidLoad和viewWillAppear到底哪个方法先被调用?实际上,理解这些方法的去向,以及为什么会这样并不重要,重要的是需要知道这些方法的作用,以及它们是如何与程序协调分工的。
 
我们知道,一般iOS应用程序都是由多个view controller构成的,每个view controller代表一个屏幕的信息。而当程序与用户交互时,根据程序中不同的状态,显示不同的view controller。例如,如果用户需要注册一个账号时,屏幕上应该显示出允许用户输入个人信息的界面,当用户完成注册之后,应该能够看到相应的主页面。
 
viewWillAppear:方法的作用是与屏幕中改变的内容进行交互。告诉view controller将对应的界面内容显示到屏幕最前端:确保view controller中所有的文本控件显示出最新的信息、必要的数据是可访问的、并对适当的通知(notification)进行观察等。当viewWillAppear:被触发时,说明对应的view
controller变为"active"状态。
 
那么viewDidLoad方法存在的理由又是什么呢?唯一的原因——有时无法或者不能有效的在XIB文件中对用户界面进行100%的配置。例如,有时希望给view设置一个特殊的属性(该属性在XIB中不可用)、有时在给一个button设置背景图片之前,希望能先对该图片进行修改、再比如,在使用auto layout时,有时你可能会意识到在XIB中进行相关操作还不如用代码来写auto
layout相关的代码。
 
我们不能根据viewDidLoad方法的调用情况,来推断出应用程序的状态相关信息。viewDidLoad方法实际上就是简单的一个文件加载后处理机制。换句话说,作为开发者,应该把viewDidLoad方法当做XIB文件的一个有效扩展,而不要理解为应用程序运转流程中的一部分。
 
这到底是什么意思呢?——我们应该在viewWillAppear:方法中对view中显示的内容进行变更,而不是在viewDidLoad中。view中的内容是程序实际运行时由controller传递给view来显示的数据(模型对象)。
 
下面我们来看一个示例:一个银行应用程序,可以显示用户当前的余额。当用户点击一个按钮时,可以在一个modal view controller中显示一个列表:该列表列出了用户附近的ATM机。在此,为了获得附近的ATM机列表信息,程序必须使用core location已经web service请求。在上面这种情况下,如果程序员把从服务器请求用户附近ATM列表的操作放到viewDidLoad中。此时,由于view controller只显示一次(viewDidLoad和viewWillAppear都只会被调用一次),所以,从服务器请求用户附近ATM列表的操作,放到viewDidLoad与viewWillAppear中,对程序的效果都是一样的。
 
但是这样做法是不好的。想一下,如果把这个ATM view controller移到tab bar controller中,会是什么情况。现在,ATM view controller——在viewDidLoad中获取ATM信息的代码只会获取一次。所以,如果你周二在亚特兰大打开该程序查找ATM,然后查询一下余额。接着周三你去了纽约,再次打开该程序时,只能看到亚特兰大的ATM信息——view已经加载过了,所以不会再调用viewDidLoad方法。
注意:在这里应该有这样的前提条件:程序没有退出。
 
实际上,在这种情况下,写代码时犯下了一个最大的错误:the easiest way is the easiest way。应用程序是会发生变化的,而用户界面也会发生改变。刚开始使用简单的方法,可能会在以后引发各种问题。
本文由破船翻译●转载请注明出处●2013-07-02
标签: none
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息