美文网首页
让 viewDidLoad 和 viewWillAppear 各

让 viewDidLoad 和 viewWillAppear 各

作者: 213dfddbef5e | 来源:发表于2017-02-26 16:18 被阅读89次

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。应用程序是会发生变化的,而用户界面也会发生改变。刚开始使用简单的方法,可能会在以后引发各种问题。

来源:http://www.tairan.com/archives/4500/

相关文章

网友评论

      本文标题:让 viewDidLoad 和 viewWillAppear 各

      本文链接:https://www.haomeiwen.com/subject/icnowttx.html