亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解iOS App開發(fā)中UIViewController的loadView方法使用

 更新時(shí)間:2016年03月15日 09:26:03   作者:ForeverYoung21  
這篇文章主要介紹了詳解iOS App開發(fā)中UIViewController的loadView方法使用,講解了訪問view屬性時(shí)loadView方法的調(diào)用及使用loadView時(shí)的一些注意點(diǎn),需要的朋友可以參考下

當(dāng)你訪問一個(gè)ViewController的view屬性時(shí),如果此時(shí)view的值是nil,那么,ViewController就會(huì)自動(dòng)調(diào)用loadView這個(gè)方法。這個(gè)方法就會(huì)加載或者創(chuàng)建一個(gè)view對(duì)象,賦值給view屬性。
loadView默認(rèn)做的事情是:如果此ViewController存在一個(gè)對(duì)應(yīng)的nib文件,那么就加載這個(gè)nib。否則,就創(chuàng)建一個(gè)UIView對(duì)象。
如果你用Interface Builder來創(chuàng)建界面,那么不應(yīng)該重載這個(gè)方法。

控制器的loadView方法以及view屬性
控制器有一個(gè)view屬性,我們經(jīng)常在控制器中通過self.view來訪問。這個(gè)view是一個(gè)很有意思的東西。
首先要明白這個(gè)view到底是什么東西。
一個(gè)控制器成為window的根控制器的時(shí)候,當(dāng)這個(gè)界面即將顯示,控制器的view會(huì)被加到window中用來顯示界面。正常情況下控制器自帶的view是"無色透明"的。
如果你在設(shè)置window的根控制器前創(chuàng)建一個(gè)Button直接加到window上,此時(shí)button出現(xiàn)在window上,但是在控制器的view的下面。此時(shí)點(diǎn)擊按鈕會(huì)發(fā)現(xiàn)按鈕并不會(huì)響應(yīng)點(diǎn)擊。
這是因?yàn)榭刂破鞯膙iew攔截了點(diǎn)擊事件,這說明它并非真的完全透明(因?yàn)槿绻耆该?,那么不?huì)攔截點(diǎn)擊事件,可以設(shè)置viewController.view.alpha = 0來驗(yàn)證,此時(shí)按鈕就可以響應(yīng)點(diǎn)擊)。事實(shí)上view是一個(gè)backgroundColor為clearColor的視圖,clearColor是幾乎透明的顏色但是并非完全透明,也就是說當(dāng)有類似點(diǎn)擊事件發(fā)生的時(shí)候,clearColor背景的view會(huì)攔截點(diǎn)擊事件,因?yàn)樗⒎峭耆该鳌?br /> 所以可以說控制器的view是一個(gè)看不見摸得著的東西...
另外view是懶加載的,也就是說,只有真正使用到控制器的view的時(shí)候它才會(huì)被創(chuàng)建出來。它就是在控制器的-loadView方法中創(chuàng)建出來的。

復(fù)制代碼 代碼如下:

- (void)loadView
{
      // 類似這種實(shí)現(xiàn)
      // 可能還會(huì)進(jìn)行更多的操作,比如判斷是否有指定storyboard,如果是就會(huì)加載storyboard中控制器的view等操作
    UIView *view = [[UIView alloc] init];
      view.backgroundColor = [UIColor clearColor];
      // ...
      _view = view;
}


前面說過,view是懶加載的,所以當(dāng)使用self.view的時(shí)候:

復(fù)制代碼 代碼如下:

- (UIView *)view
{
      // 類似這種實(shí)現(xiàn)
    if (_view == nil) {
        [self loadView];
        [self viewDidLoad];
    }
    return _view;
}


當(dāng)_view為nil的時(shí)候會(huì)調(diào)用loadView方法方法,此時(shí)系統(tǒng)默認(rèn)會(huì)創(chuàng)建一個(gè)UIView對(duì)象并將其賦值給_view,此時(shí)_view有了值,接著調(diào)用viewDidLoad方法。
當(dāng)再次訪問self.view的時(shí)候,因?yàn)開view已經(jīng)有值,所以會(huì)直接返回_view。這也是為什么loadView以及viewDidLoad方法只會(huì)執(zhí)行一次。
之前的文章提到過,在給window設(shè)置完根控制器,根控制器的view并不是馬上就被加到window上,也就是說此時(shí)view還未創(chuàng)建。在[self.window makeKeyAndVisible]之后界面即將顯示的時(shí)候,這時(shí)候需要用到view,此時(shí)就會(huì)調(diào)用view的getter方法,接著執(zhí)行l(wèi)oadView,在接著執(zhí)行viewDidLoad等一系列方法。
現(xiàn)在我們知道view是懶加載的,所以如果在[self.window makeKeyAndVisible]之前就用到控制器的view,那么它就會(huì)"提前”創(chuàng)建。

復(fù)制代碼 代碼如下:

NSLog(@"%@", viewController.view); // 此時(shí)用到view,就會(huì)創(chuàng)建view


現(xiàn)在我們知道控制器的view是通過loadView方法創(chuàng)建的了,所以我們可以覆寫這個(gè)方法來達(dá)到改變控制器的自帶view的目的:

復(fù)制代碼 代碼如下:

- (void)loadView
{
    JYView *view = [[JYView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    view.background = [UIColor blueColor];
    _view = view;
}


此時(shí)我們就改變了控制器原本自動(dòng)創(chuàng)建的view,現(xiàn)在使用self.view則得到的是JYView的對(duì)象。


loadView使用中的一些注意點(diǎn)
永遠(yuǎn)不要主動(dòng)調(diào)用這個(gè)函數(shù)。view controller會(huì)在view的property被請(qǐng)求并且當(dāng)前view值為nil時(shí)調(diào)用這個(gè)函數(shù)。如果你手動(dòng)創(chuàng)建view,你應(yīng)該重載這個(gè)函數(shù)。如果你用IB創(chuàng)建view并初始化view controller,那就意味著你使用initWithNibName:bundle:方法,這時(shí),你不應(yīng)該重載loadView函數(shù)。
這個(gè)方法的默認(rèn)實(shí)現(xiàn)是這樣:先尋找有關(guān)可用的nib文件的信息,根據(jù)這個(gè)信息來加載nib文件,如果沒有有關(guān)nib文件的信息,默認(rèn)實(shí)現(xiàn)會(huì)創(chuàng)建一個(gè)空白的UIView對(duì)象,然后讓這個(gè)對(duì)象成為controller的主view。
所以,重載這個(gè)函數(shù)時(shí),你也應(yīng)該這么做。并把子類的view賦給view屬性(property)(你create的view必須是唯一的實(shí)例,并且不被其他任何controller共享),而且你重載的這個(gè)函數(shù)不應(yīng)該調(diào)用super。
如果你要進(jìn)行進(jìn)一步初始化你的views,你應(yīng)該在viewDidLoad函數(shù)中去做。在iOS 3.0以及更高版本中,你應(yīng)該重載viewDidUnload函數(shù)來釋放任何對(duì)view的引用或者它里面的內(nèi)容(子view等等)。

相關(guān)文章

  • IOS 中彈框的實(shí)現(xiàn)方法整理

    IOS 中彈框的實(shí)現(xiàn)方法整理

    這篇文章主要介紹了IOS 中彈框的實(shí)現(xiàn)方法整理的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • 快速解決低版本Xcode不支持高版本iOS真機(jī)調(diào)試的問題方法

    快速解決低版本Xcode不支持高版本iOS真機(jī)調(diào)試的問題方法

    這篇文章主要介紹了快速解決低版本Xcode不支持高版本iOS真機(jī)調(diào)試的問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • 解決iOS13 無法獲取WiFi名稱(SSID)問題

    解決iOS13 無法獲取WiFi名稱(SSID)問題

    這篇文章主要介紹了解決iOS13 無法獲取WiFi名稱(SSID)問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • iOS開發(fā)tips-UINavigationBar的切換效果

    iOS開發(fā)tips-UINavigationBar的切換效果

    這篇文章主要為大家詳細(xì)介紹了iOS開發(fā)tips-UINavigationBar的切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • IOS面試大全之常見算法

    IOS面試大全之常見算法

    之前看了很多面試題,感覺要不是不夠就是過于冗余,于是我將網(wǎng)上的一些面試題進(jìn)行了刪減和分類,這篇文章先給大家分享一下IOS中的常見算法,有需要的可以參考借鑒。
    2016-09-09
  • 如何使用IOS實(shí)現(xiàn)WIFI傳輸

    如何使用IOS實(shí)現(xiàn)WIFI傳輸

    這篇文章主要介紹了如何使用IOS實(shí)現(xiàn)WIFI傳輸,對(duì)局域網(wǎng)傳輸和HTTP感興趣的同學(xué),可以參考下
    2021-04-04
  • 詳解iOS開發(fā)之NSURLProtocol的那些坑

    詳解iOS開發(fā)之NSURLProtocol的那些坑

    本篇文章主要介紹了詳解iOS開發(fā)之NSURLProtocol的那些坑,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • iOS使用CIFilter生成二維碼

    iOS使用CIFilter生成二維碼

    這篇文章主要介紹了iOS使用CIFilter生成二維碼,二維碼的生成和讀取只需要使用Core Image框架和AVFoundation框架就能輕松實(shí)現(xiàn)。在這里,我們主要介紹二維碼的生成。有興趣的可以了解一下
    2017-12-12
  • iOS中幾種定時(shí)器的實(shí)現(xiàn)小結(jié)

    iOS中幾種定時(shí)器的實(shí)現(xiàn)小結(jié)

    這篇文章主要介紹了iOS中幾種定時(shí)器的實(shí)現(xiàn)小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • iOS 判斷頁面中的該填項(xiàng)是否填完整,改變按鈕狀態(tài)的方法

    iOS 判斷頁面中的該填項(xiàng)是否填完整,改變按鈕狀態(tài)的方法

    下面小編就為大家分享一篇iOS 判斷頁面中的該填項(xiàng)是否填完整,改變按鈕狀態(tài)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01

最新評(píng)論