一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - 詳解iOS App開發中UIViewController的loadView方法使用

詳解iOS App開發中UIViewController的loadView方法使用

2021-01-10 14:52ForeverYoung21 IOS

這篇文章主要介紹了詳解iOS App開發中UIViewController的loadView方法使用,講解了訪問view屬性時loadView方法的調用及使用loadView時的一些注意點,需要的朋友可以參考下

當你訪問一個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詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111302021-03-15
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5272021-01-16
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
主站蜘蛛池模板: 波多野结衣在线免费观看 | 亚洲高清国产拍精品影院 | 午夜福利08550 | 亚洲国产99在线精品一区69堂 | 变态女王麻麻小说在线阅读 | 日韩在线一区二区三区 | 热热99| 国产亚洲精品精品国产亚洲综合 | 男人搡女人视频免费看 | 欧洲另类一二三四区 | 激情婷婷综合久久久久 | 国产香蕉国产精品偷在线观看 | 男人狂躁女人下面狂叫图片 | 午夜一区二区福利视频在线 | 亚洲高清视频在线观看 | 亚洲欧美日韩国产一区二区精品 | 国产亚洲精品美女久久久 | 国产精品女主播大秀在线 | 日韩二三区 | 亚洲欧美视频在线播放 | 女同学高中你下面好紧 | 欧美精品v日韩精品v国产精品 | 亚洲一欧洲中文字幕在线 | 日本伊人色综合网 | 国产未成女年一区二区 | avtt天堂在线 | 精品性久久 | 亚洲欧美日韩综合在线 | 久久免费看少妇高潮A片特爽 | 性一交一乱一伧老太 | 日本人在线看片 | 天堂久久久久va久久久久 | 免费观看一级一片 | 免费被黄网站在观看 | 天天av天天翘天天综合网 | 国产精品天天影视久久综合网 | 欧美黑人性猛交╳xx╳动态图 | 草啪啪| 亚洲无人区乱码中文字幕 | 亚洲黄色图 | 免费看黄色大片 |