當你拜訪一個ViewController的view屬性時,假如此時view的值是nil,那末,ViewController就會主動挪用loadView這個辦法。這個辦法就會加載或許創立一個view對象,賦值給view屬性。
loadView默許做的工作是:假如此ViewController存在一個對應的nib文件,那末就加載這個nib。不然,就創立一個UIView對象。
假如你用Interface Builder來創立界面,那末不該該重載這個辦法。
掌握器的loadView辦法和view屬性
掌握器有一個view屬性,我們常常在掌握器中經由過程self.view來拜訪。這個view是一個很成心思的器械。
起首要明確這個view究竟是甚麼器械。
一個掌握器成為Window的根掌握器的時刻,當這個界面行將顯示,掌握器的view會被加到Window頂用來顯示界面。正常情形下掌握器自帶的view是"無色通明"的。
假如你在設置Window的根掌握器前創立一個Button直接加到window上,此時button湧現在window上,然則在掌握器的view的上面。此時點擊按鈕會發明按鈕其實不會呼應點擊。
這是由於掌握器的view攔阻了點擊事宜,這解釋它並不是真的完整通明(由於假如完整通明,那末不會攔阻點擊事宜,可以設置viewController.view.alpha = 0來驗證,此時按鈕便可以呼應點擊)。現實上view是一個backgroundColor為clearColor的視圖,clearColor是簡直通明的色彩然則並不是完整通明,也就是說當有相似點擊事宜產生的時刻,clearColor配景的view會攔阻點擊事宜,由於它並不是完整通明。
所以可以說掌握器的view是一個看不見摸得著的器械...
別的view是懶加載的,也就是說,只要真正應用到掌握器的view的時刻它才會被創立出來。它就是在掌握器的-loadView辦法中創立出來的。
- (void)loadView
{
// 相似這類完成
// 能夠還會停止更多的操作,好比斷定能否有指定storyboard,假如是就會加載storyboard中掌握器的view等操作
UIView *view = [[UIView alloc] init];
view.backgroundColor = [UIColor clearColor];
// ...
_view = view;
}
後面說過,view是懶加載的,所以當應用self.view的時刻:
- (UIView *)view
{
// 相似這類完成
if (_view == nil) {
[self loadView];
[self viewDidLoad];
}
return _view;
}
當_view為nil的時刻會挪用loadView辦法辦法,此時體系默許會創立一個UIView對象並將其賦值給_view,此時_view有了值,接著挪用viewDidLoad辦法。
當再次拜訪self.view的時刻,由於_view曾經有值,所以會直接前往_view。這也是為何loadView和viewDidLoad辦法只會履行一次。
之前的文章提到過,在給window設置完根掌握器,根掌握器的view其實不是立時就被加到window上,也就是說此時view還未創立。在[self.window makeKeyAndVisible]以後界面行將顯示的時刻,這時候候須要用到view,此時就會挪用view的getter辦法,接著履行loadView,在接著履行viewDidLoad等一系列辦法。
如今我們曉得view是懶加載的,所以假如在[self.window makeKeyAndVisible]之前就用到掌握器的view,那末它就會"提早”創立。
NSLog(@"%@", viewController.view); // 此時用到view,就會創立view
如今我們曉得掌握器的view是經由過程loadView辦法創立的了,所以我們可以覆寫這個辦法來到達轉變掌握器的自帶view的目標:
- (void)loadView
{
JYView *view = [[JYView alloc] initWithFrame:[UIScreen mainScreen].bounds];
view.background = [UIColor blueColor];
_view = view;
}
此時我們就轉變了掌握器本來主動創立的view,如今應用self.view則獲得的是JYView的對象。
loadView應用中的一些留意點
永久不要自動挪用這個函數。view controller會在view的property被要求而且以後view值為nil時挪用這個函數。假如你手動創立view,你應當重載這個函數。假如你用IB創立view並初始化view controller,那就意味著你應用initWithNibName:bundle:辦法,這時候,你不該該重載loadView函數。
這個辦法的默許完成是如許:先尋覓有關可用的nib文件的信息,依據這個信息來加載nib文件,假如沒有有關nib文件的信息,默許完成會創立一個空白的UIView對象,然後讓這個對象成為controller的主view。
所以,重載這個函數時,你也應當這麼做。並把子類的view賦給view屬性(property)(你create的view必需是獨一的實例,而且不被其他任何controller同享),並且你重載的這個函數不該該挪用super。
假如你要停止進一步初始化你的views,你應當在viewDidLoad函數中去做。在IOS 3.0和更高版本中,你應當重載viewDidUnload函數來釋聽任何對view的援用或許它外面的內容(子view等等)。
【詳解iOS App開辟中UIViewController的loadView辦法應用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!