使用TableView時(shí),自定義Cell都是抽取的一個(gè)類,通過屬性正向傳值設(shè)置Cell自身屬性,這是因?yàn)镃ell是一個(gè)簡(jiǎn)單的View,而控制器中的View采用的是一種懶加載的方式,在OC中,如果控制器間通過屬性正向傳值,將屬性賦值寫在Setter方法中,就會(huì)發(fā)現(xiàn)設(shè)置屬性無(wú)效,以簡(jiǎn)單的通訊錄為例:
控制器結(jié)構(gòu):
NavigationController
TableViewController↓(NavigationController根控制器),push到下級(jí)ViewController
ViewController(.h中包含一個(gè)Person的模型對(duì)象,從上級(jí)控制器獲得)
假設(shè)person包含name和age屬性,ViewController中包含兩個(gè)TextField,通過person這個(gè)對(duì)象賦值
在ViewController中分別在person這個(gè)屬性的setter方法中 , loadView , viewDidLoad 中打上斷點(diǎn)
1.setter方法
2.LoadView
3.viewDidLoad
運(yùn)行順序:setter方法--> LoadView --> viewDidLoad
運(yùn)行Setter方法時(shí),ViewController的View還沒有創(chuàng)建,所以上面的子控件也還沒被創(chuàng)建,所以這時(shí)子控件為nil,OC中nil調(diào)用任何方法都不會(huì)報(bào)錯(cuò),所以這時(shí)既不會(huì)報(bào)錯(cuò),也不會(huì)正常呈現(xiàn)數(shù)據(jù).
所以控制器間傳值設(shè)置屬性時(shí),一般寫在ViewDidLoad中,除非有特殊需要,可以提前手動(dòng)完成控制器View的創(chuàng)建.
如果是需要修改frame或約束,最好寫在viewDidLayoutSubviews或viewDidAppear中,因?yàn)関iewDidLoad中只是試圖加載完成,Frame信息并不一定真實(shí)
Swift中稍有不同,這么寫會(huì)直接報(bào)錯(cuò)
在賦值前調(diào)用一次控制器的view,讓控制器的view完成懶加載就可以完成賦值了,但正常情況下還是推薦寫在viewDidLoad中