使用TableView时,自定义Cell都是抽取的一个类,通过属性正向传值设置Cell自身属性,这是因为Cell是一个简单的View,而控制器中的View采用的是一种懒加载的方式,在OC中,如果控制器间通过属性正向传值,将属性赋值写在Setter方法中,就会发现设置属性无效,以简单的通讯录为例:
控制器结构:
NavigationController
TableViewController↓(NavigationController根控制器),push到下级ViewController
ViewController(.h中包含一个Person的模型对象,从上级控制器获得)
假设person包含name和age属性,ViewController中包含两个TextField,通过person这个对象赋值
在ViewController中分别在person这个属性的setter方法中 , loadView , viewDidLoad 中打上断点
1.setter方法
2.LoadView
3.viewDidLoad
运行顺序:setter方法--> LoadView --> viewDidLoad
运行Setter方法时,ViewController的View还没有创建,所以上面的子控件也还没被创建,所以这时子控件为nil,OC中nil调用任何方法都不会报错,所以这时既不会报错,也不会正常呈现数据.
所以控制器间传值设置属性时,一般写在ViewDidLoad中,除非有特殊需要,可以提前手动完成控制器View的创建.
如果是需要修改frame或约束,最好写在viewDidLayoutSubviews或viewDidAppear中,因为viewDidLoad中只是试图加载完成,Frame信息并不一定真实
Swift中稍有不同,这么写会直接报错
在赋值前调用一次控制器的view,让控制器的view完成懒加载就可以完成赋值了,但正常情况下还是推荐写在viewDidLoad中