为何属性赋值不能写在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方法


1_setter方法.png

2.LoadView

2_loadView.png

3.viewDidLoad

3_viewDidLoad.png

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

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

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

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

4_Swift_01.png

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

5_Swift_02.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 27、ViewController的didReceiveMemoryWarning是在什么时候调用的?默认的操作是...
    烟雨平生花飞舞阅读 623评论 0 1
  • 1、截取字符串”20 | http://www.baidu.com”中,”|”字符前面和后面的数据,分别输出它们 ...
    强子ly阅读 3,026评论 8 46
  • 37.cocoa内存管理规则 1)当你使用new,alloc或copy方法创建一个对象时,该对象的保留计数器值为1...
    如风家的秘密阅读 893评论 0 4