为何属性赋值不能写在Setter方法中(控制器间正向传值)

使用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方法


为何属性赋值不能写在Setter方法中(控制器间正向传值)_第1张图片
1_setter方法.png

2.LoadView

为何属性赋值不能写在Setter方法中(控制器间正向传值)_第2张图片
2_loadView.png

3.viewDidLoad

为何属性赋值不能写在Setter方法中(控制器间正向传值)_第3张图片
3_viewDidLoad.png

运行顺序:setter方法--> LoadView --> viewDidLoad

运行Setter方法时,ViewController的View还没有创建,所以上面的子控件也还没被创建,所以这时子控件为nil,OC中nil调用任何方法都不会报错,所以这时既不会报错,也不会正常呈现数据.
所以控制器间传值设置属性时,一般写在ViewDidLoad中,除非有特殊需要,可以提前手动完成控制器View的创建.

如果是需要修改frame或约束,最好写在viewDidLayoutSubviews或viewDidAppear中,因为viewDidLoad中只是试图加载完成,Frame信息并不一定真实

Swift中稍有不同,这么写会直接报错

为何属性赋值不能写在Setter方法中(控制器间正向传值)_第4张图片
4_Swift_01.png

在赋值前调用一次控制器的view,让控制器的view完成懒加载就可以完成赋值了,但正常情况下还是推荐写在viewDidLoad中

为何属性赋值不能写在Setter方法中(控制器间正向传值)_第5张图片
5_Swift_02.png

你可能感兴趣的:(为何属性赋值不能写在Setter方法中(控制器间正向传值))