VC和view一些方法調用順序

UIView的layoutSubviews和drawRect方法什麼時候調用 http://blog.sina.com.cn/s/blog_afb4d07f0101iamg.htmlhtml

loadView和viewDidLoad

loadView和viewDidLoad是iPhone開發中確定要用到的倆個方法,他們均可以用來在試圖載入的時候初始化一些內容,可是他們有什麼區別呢?安全

我在Xcode7.3.1上試驗,無論是從xib建立views仍是代碼建立views,這倆個方法都會走,並且是先走前者,再走後者。ui

建立一個類和實例化一個類.在XCode中建立一個類和實例化一個類很容易區分,可是在IB(Interface Builder)中有時候就會迷糊.其實也很好區分,孤零零地建立了一個nib文件,沒有和其餘可被實例化的類有直接或間接關係的時候,這個類或這些類(一個nib文件俺也可能包含多個類)是沒有機會被實例化的,因此這種狀況只是經過ib建立了一個類,而沒有實例化.真正的實例化還須要經過在Xcode用代碼來讀取這個nib文件.知道這兩這的區別後這些方法也就容易辨認多了spa

viewDidLoad其實沒什麼可混淆的,不管經過什麼途徑加載(Xcode或者IB,這裏的加載屬於實例化)完view後確定會執行這個方法.code

loadView須要分兩種狀況.當你經過Xcode實例化一個類的時候就須要本身在controller中實現這個方法.而在IB中實例化就不須要實現它.但若是你實現它,它也會調用,並且是在viewDidLoad以前,固然在它的實現裏能夠什麼都不作。htm

UIView中一些重要方法initWithFrame、initWithCoder、awakeFromNib、drawRect什麼時候調用

initWithFrame、initWithCoder、awakeFromNib、drawRect這幾個方法在自定義控件的時候,會常常調用,具體什麼狀況下會調用哪一個方法下面總結blog

-(id)initWithFrame:當控件不是從xib、storyboard中建立時,會調用這個方法開發

-(id)initWithCoder:當控件是從從xib、storyboard中建立時,會調用這個方法get

-(void)awakeFromNib這個方法在-(id)initWithCoder:方法後調用it

能夠理解爲:通過-(id)initWithCoder:建立出來的控件是死的,而後經過awakeFromNib來喚醒,因此會有一個前後的調用順序。

這3個方法都須要調用[super ],調用其父視圖的對應方法

通常來講,爲了安全起見,初始化控件的代碼咱們寫在一個方法裏面,而後咱們分別在initWithFrame和initWithCoder中都調用一下,這樣就保證了不管你是經過什麼方式建立的控件,代碼都能起做用。

-(void)drawRect:方法不論用代碼建立實例仍是xib建立,若是實現了都會調用到的。調用順序經實驗是:

/*
 xib建立實例
 13:23:10.005 UIView9.26[20419:10042299] -[MyView initWithCoder:]
 13:23:10.007 UIView9.26[20419:10042299] -[MyView awakeFromNib]
 13:23:10.007 UIView9.26[20419:10042299] -[ViewController viewDidLoad]
 13:23:10.014 UIView9.26[20419:10042299] -[MyView drawRect:]
 */

/*
 代碼建立實例
 13:26:58.854 UIView9.26[20432:10043790] -[ViewController viewDidLoad]
 13:26:58.855 UIView9.26[20432:10043790] -[MyView initWithFrame:]
 13:26:58.861 UIView9.26[20432:10043790] -[MyView drawRect:]
 */
相關文章
相關標籤/搜索