View的生命周期
ViewController的初始化方式
viewController
有三種初始化方式 - 通過純代碼創(chuàng)建掺冠,通過IB創(chuàng)建和通過StoryBoard創(chuàng)建
- ********通過storyboard創(chuàng)建******** - 通過創(chuàng)建
UIStoryboard
的實例沉馆,調用instantiateViewControllerWithIdentifier:
方法,便可以創(chuàng)建一個視圖控制器 - ********通過IB創(chuàng)建******** - 通過調用控制器的
initWithNibName:bundle:
初始化方法德崭,傳入相應的nibName
即可 - ********通過純代碼創(chuàng)建******** - 調用
init
便可以創(chuàng)建一個視圖控制器
awakeFromNib
當nib
文件完成解碼時斥黑,nib
的加載機制會向相關對象發(fā)送awakeFromNib
消息硕舆。簡單的說啼染,如果一個對象的awakeFromNib
函數被調用总寻,就表明這個對象已經成功的通過nib
文件創(chuàng)建北戏。只用通過IB或者是Storyboard的方式創(chuàng)建的對象才會調用該函數朴上。
在view controller
的子類中英遭,如果在函數被調用庵佣,表明相應的視圖控制器已經創(chuàng)建检柬。但此時視圖控制器的視圖其實都還沒有創(chuàng)建服球。
在view
的子類中茴恰,如果該函數被調用,表明該視圖已經創(chuàng)建完成斩熊,視圖上的相關控件都也已經創(chuàng)建完成琐簇,而且outlet and action
的聯(lián)系也已經創(chuàng)建。
loadView和viewDidLoad
因為視圖控制器中的view
是采用lazy加載模式座享,所以當view
第一次被調用時才會進行加載婉商。
loadView
- 在當view
屬性被調用,但值為nil
時才會被調用渣叛。你不能自己手動調用這個函數丈秩,這個函數會加載或創(chuàng)建一個view
并賦值給視圖控制器的view
屬性
如果視圖控制器的nibName
不為nil
時蘑秽,說明有相關的nib
文件。這種情況發(fā)生在使用storyboard
肠牲,直接調用initWithNibName:bundle:
靴跛,或發(fā)現(xiàn)程序沙盒app bundle
中有和視圖控制器的類名相同的nib
文件時。如果沒有相關聯(lián)的nib
文件肥印,這個函數會默認創(chuàng)建一個UIView
的實例。
如果你是使用IB進行來創(chuàng)建視圖深碱,那你一定不能重載這個函數。
如果你是使用純代碼創(chuàng)建視圖功咒,你可以重載這個函數設置根視圖并賦值給view
屬性,并且在這個函數中不能調用父類的該方法绞蹦。
viewDidLoad
- 當view controller
的視圖已經被加載進內存后調用,你可以重載這個函數刊侯,對視圖進行調整锉走。
viewWillLayoutSubviews 和 viewDidLayoutSubviews
當視圖控制器的視圖view
的大小bounds
發(fā)生改變或者是調整了視圖view
的子視圖的位置positions
時,會被調用亭饵。這兩個函數默認是沒有執(zhí)行任何操作梁厉,你可以在自己的viewController
的子類中重寫這兩個函數。
viewDidLayoutSubviews
- 這個函數調用词顾,標示根視圖已經布局完成,但不意味著view
的子視圖都已經完成了布局昔驱,每一個視圖的布局都由自己負責上忍。
viewWillAppear 和 viewDidAppear
viewWillAppear
- 當view controller
的視圖將要被添加到視圖的層次結構(view hierarchy
)之前和要執(zhí)行展示視圖相關的動畫之前,該函數會被調用腋颠。如果重載了該函數吓笙,必須調用super
的方法。如果的view controller(VC1)
通過popover
彈出一個新的view controller(VC2)
,當VC2
消失(dismiss
)時,VC1
并不會調用viewWillAppear
函數
viewDidAppear
- 當視圖控制器的視圖(view
)已經添加到視圖的層次結構(view hierarchy
)之后侮穿,會調用該函數歌径。同樣的回铛,如果的view controller(VC1)
通過popover
彈出一個新的view controller(VC2)
克锣,當VC2
消失(dismiss
)時,VC1
并不會調用viewDidAppear
函數
viewWillDisappear 和 viewDidDisappear
和viewWillAppear
和viewDidAppear
方法類似验残,在視圖控制器的視圖從視圖的層次結構中被移除的前后巾乳,會調用這兩個方法
layoutSubviews
layoutSubviews
并不是視圖控制器的函數,而是視圖(view
)的一個方法胆绊。可以通過重寫該方法仆抵,為視圖的子視圖添加約束种冬,確定確定子視圖的大小和位置。你不可以直接調用該方法娱两,當要更新視圖布局是,可以將該視圖通過調用setNeedsLayout
方法進行標記慨蛙,當該視圖會在下一個重繪時調用layoutSubviews
方法纪挎。如果想立即更新視圖,可以通過調用layoutIfNeeded
方法實現(xiàn)通砍。
ViewController的周期
initWithCoder:
或initWithNibName:bundle:
- 初始化視圖控制器
awakeFromNib
-如果是通過xib或storyboard創(chuàng)建的,會調用該方法封孙,表明視圖控制器已經從nib
文件中加載成功。
loadView
- 創(chuàng)建或加載根視圖泡徙,一般來說只會調用一次膜蠢。
viewDidload
- 表明視圖控制器中的視圖已經創(chuàng)建或加載完畢,xib或storyboard中的各種控件這時候也依舊加載成功礁竞。
viewWillAppear
- 視圖將要顯示之前調用杉辙。
viewWillLayoutSubviews
-將要對視圖進行布局。
viewDiDLayoutSubviews
-對視圖布局完成蜘矢。
viewDidAppear
- 視圖已經顯示在屏幕上之后調用。
viewWillDisappear
- 視圖將要從屏幕上移除上調用并淋。
viewDidDisappear
- 視圖已經從屏幕上移除之后調用珍昨。
當VC1
pushVC2
時,viewWillAppear
兔毙、 viewDidAppear
、 viewWillDisappear
澎剥、 viewDidDisappear
的調用順序是什么赶舆?
具體的調用順序
VC1 : viewWillDisappear
VC2 : viewWillAppear
VC1 : viewDidDisappear
VC2 : viewDidAppear