UIViewController

概要

管理UIKit應(yīng)用程序的視圖層次結(jié)構(gòu)的對象舅巷。
UIViewController類定義所有視圖控制器通用的共享行為而芥。 您很少直接創(chuàng)建UIViewController類的實(shí)例讹俊。 相反哨免,您將UIViewController子類化摊腋,并添加管理視圖控制器視圖層次結(jié)構(gòu)所需的方法和屬性。

視圖控制器的主要職責(zé)包括以下內(nèi)容:

  1. 更新視圖的內(nèi)容哈雏,通常是為了響應(yīng)對基礎(chǔ)數(shù)據(jù)的更改楞件。

  2. 響應(yīng)用戶與視圖的交互衫生。

  3. 調(diào)整視圖大小并管理整個界面的布局。

  4. 在應(yīng)用程序中與其他對象(包括其他視圖控制器)協(xié)調(diào)土浸。

    UIViewController與它管理的視圖緊密綁定罪针,并參與處理事件的響應(yīng)鏈。UIViewController也繼承自UIResponder對象黄伊,其被插入到視圖控制器的根視圖和視圖的父視圖之間的響應(yīng)鏈(通常屬于不同的視圖控制器)泪酱。如果UIViewController的視圖沒有處理事件,視圖控制器具有處理該事件的選擇或傳給父視圖还最。
    UIViewController很少單獨(dú)使用西篓。相反,你經(jīng)常會使用多個UIViewController憋活,每個UIViewController擁有你應(yīng)用程序用戶界面的一部分。例如虱黄,一個UIViewController可以顯示一個項(xiàng)目表悦即,而另一個UIViewController則顯示該表中的選定項(xiàng)。通常橱乱,只有一個UIViewController的視圖每次是可見的辜梳。一個UIViewController可以呈現(xiàn)一個不同的UIViewController來顯示一組新的視圖,或者它可以作為其他UIViewController的內(nèi)容和動畫視圖的容器泳叠。

子類繼承要點(diǎn)

每個應(yīng)用程序都包含至少一個自定義UIViewController作瞄。更多的時候,應(yīng)用程序包含許多自定義UIViewController危纫。自定義UIViewController定義您的應(yīng)用程序的整體行為宗挥,包括應(yīng)用程序的外觀,以及它如何響應(yīng)用戶交互种蝶。以下部分簡要介紹了自定義子類執(zhí)行的某些任務(wù)契耿。有關(guān)使用和實(shí)現(xiàn)視圖控制器的詳細(xì)信息:

UIViewController的聲明周期

控制器的聲明周期.png

1,初始化
1.1 當(dāng)使用 Storyboard 時螃征,
1.1.1控制器的構(gòu)造器為 init(coder:)
1.1.2awakeFromNib()
1.2 當(dāng)使用純代碼創(chuàng)建控制器搪桂,
控制器的構(gòu)造器為 init(nibName:bundle:)
雖然使用代碼創(chuàng)建時調(diào)用了該構(gòu)造器,但傳入的參數(shù)均為 nil
2盯滚,loadView()
3踢械,viewDidLoad()
4,viewWillAppear()
5魄藕,viewDidAppear()
6内列,viewWillDisappear()
7,viewDidDisappear()
8泼疑,didReceiveMemoryWarning()內(nèi)存警告時
9德绿,delloc

聲明周期的應(yīng)用

  1. init 中初始化控制器中的對象
- (instancetype)init {
    if (self = [super init]) {
        
    }
    return self;
}

2,loadView 一般不重寫荷荤,重寫是為了更換控制器器的屬性View。
2.1 loadView() 即加載控制器管理的 view移稳。
2.2 不能直接手動調(diào)用該方法蕴纳;當(dāng) view 被請求卻為 nil 時,該方法加載并創(chuàng)建 view个粱。
2.3 若控制器有關(guān)聯(lián)的 Nib 文件古毛,該方法會從 Nib 文件中加載 view;如果沒有都许,則創(chuàng)建空白 UIView 對象稻薇。
2.4 如果使用 Interface Builder 創(chuàng)建 view,則務(wù)必不要重寫該方法胶征。
2.5 可以使用該方法手動創(chuàng)建視圖塞椎,且需要將根視圖分配為 view;自定義實(shí)現(xiàn)不應(yīng)該再調(diào)用父類的該方法睛低。
2.6 執(zhí)行其他初始化操作案狠,建議放在 viewDidLoad() 中。

[loadView钱雷、viewDidLoad及viewDidUnload的關(guān)系]

loadView

1骂铁,什么時候被調(diào)用?
每次訪問UIViewController的view(比如controller.view罩抗、self.view)而且view為nil拉庵,loadView方法就會被調(diào)用。
2套蒂,有什么作用钞支?
loadView方法是用來負(fù)責(zé)創(chuàng)建UIViewController的view

3,默認(rèn)實(shí)現(xiàn)是怎樣的泣懊?
默認(rèn)實(shí)現(xiàn)即[super loadView]里面做了什么事情伸辟。

3.1它會先去查找與UIViewController相關(guān)聯(lián)的xib文件,通過加載xib文件來創(chuàng)建UIViewController的view
如果在初始化UIViewController指定了xib文件名馍刮,就會根據(jù)傳入的xib文件名加載對應(yīng)的xib文件

[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];

3.2 如果沒有明顯地傳xib文件名信夫,就會加載跟UIViewController同名的xib文件

[[ViewController alloc] init]; // 加載ViewController.xib

3.3 如果沒有找到相關(guān)聯(lián)的xib文件,就會創(chuàng)建一個空白的UIView卡啰,然后賦值給UIViewController的view屬性静稻,大致如下

self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
// applicationFrame的值是:{{x = 0, y = 20}, {width = 320, height = 460}}

[super loadView]里面就大致完成這3步
怎樣正確使用這個方法?
大家都知道UIViewController的view可以通過xib文件來創(chuàng)建匈辱,但是在某些情況下振湾,xib不是那么地靈活,所以有時候我們想通過代碼來創(chuàng)建UIView亡脸,比如:

self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];

如果想通過代碼來創(chuàng)建UIViewController的view押搪,就要重寫loadView方法树酪,并且不需要調(diào)用[super loadView],因?yàn)樵诘?點(diǎn)里面已經(jīng)提到:若沒有xib文件大州,[super loadView]默認(rèn)會創(chuàng)建一個空白的UIView续语。我們既然要通過代碼來自定義UIView,那么就沒必要事先創(chuàng)建一個空白的UIView厦画,以節(jié)省不必要的開銷疮茄。正確的做法應(yīng)該是這樣:

- (void)loadView {
    self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
}

不需要調(diào)用[super loadView],你調(diào)用了也不會出錯根暑,只是造成了一些不必要的開銷力试。

總結(jié)一句話,蘋果設(shè)計(jì)這個方法就是給我們自定義UIViewController的view用的

viewDidLoad

什么時候被調(diào)用排嫌?
無論你是通過xib文件還是重寫loadView方法創(chuàng)建UIViewController的view畸裳,在view創(chuàng)建完畢后,最終都會調(diào)用viewDidLoad方法
有什么作用淳地?

一般我們會在這里做界面上的初始化操作躯畴,比如往view中添加一些子視圖、從數(shù)據(jù)庫或者網(wǎng)絡(luò)加載模型數(shù)據(jù)裝配到子視圖中薇芝。例如:

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 添加一個按鈕
    UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];
    [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}

viewDidUnload

什么時候被調(diào)用?

iOS設(shè)備的內(nèi)存是極其有限的丰嘉,如果應(yīng)用程序占用的內(nèi)存過多的話夯到,系統(tǒng)就會對應(yīng)用程序發(fā)出內(nèi)存警告。UIViewController就會收到didReceiveMemoryWarning消息饮亏。didReceiveMemoryWarning方法的默認(rèn)實(shí)現(xiàn)是:如果當(dāng)前UIViewController的view不在應(yīng)用程序的視圖層次結(jié)構(gòu)(View Hierarchy)中耍贾,即view的superview為nil的時候,就會將view釋放路幸,并且調(diào)用viewDidUnload方法
有什么作用荐开?

上面說到,發(fā)出內(nèi)存警告且view被釋放的時候就會調(diào)用viewDidUnload方法简肴,所以一般在釋放資源晃听,主要是釋放界面元素相關(guān)的資源,將相關(guān)的實(shí)例都賦值為nil

- (void)viewDidUnload {
    [super viewDidUnload];
    self.name = nil;
    self.pwd = nil;
}

三個方法的關(guān)系

第一次訪問UIViewController的view時砰识,view為nil能扒,然后就會調(diào)用loadView方法創(chuàng)建view

view創(chuàng)建完畢后會調(diào)用viewDidLoad方法進(jìn)行界面元素的初始化

當(dāng)內(nèi)存警告時,系統(tǒng)可能會釋放UIViewController的view辫狼,將view賦值為nil初斑,并且調(diào)用viewDidUnload方法

當(dāng)再次訪問UIViewController的view時,view已經(jīng)在3中被賦值為nil膨处,所以又會調(diào)用loadView方法重新創(chuàng)建view

view被重新創(chuàng)建完畢后见秤,還是會調(diào)用viewDidLoad方法進(jìn)行界面元素的初始化

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砂竖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鹃答,更是在濱河造成了極大的恐慌乎澄,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挣跋,死亡現(xiàn)場離奇詭異三圆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)避咆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門舟肉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人查库,你說我怎么就攤上這事路媚。” “怎么了樊销?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵整慎,是天一觀的道長。 經(jīng)常有香客問我围苫,道長裤园,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任剂府,我火速辦了婚禮拧揽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腺占。我一直安慰自己淤袜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布衰伯。 她就那樣靜靜地躺著铡羡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪意鲸。 梳的紋絲不亂的頭發(fā)上烦周,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音怎顾,去河邊找鬼论矾。 笑死,一個胖子當(dāng)著我的面吹牛杆勇,可吹牛的內(nèi)容都是我干的贪壳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蚜退,長吁一口氣:“原來是場噩夢啊……” “哼闰靴!你這毒婦竟也來了彪笼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蚂且,失蹤者是張志新(化名)和其女友劉穎配猫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杏死,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泵肄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了淑翼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腐巢。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖玄括,靈堂內(nèi)的尸體忽然破棺而出冯丙,到底是詐尸還是另有隱情,我是刑警寧澤遭京,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布胃惜,位于F島的核電站,受9級特大地震影響哪雕,放射性物質(zhì)發(fā)生泄漏船殉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一斯嚎、第九天 我趴在偏房一處隱蔽的房頂上張望捺弦。 院中可真熱鬧,春花似錦孝扛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至慌申,卻和暖如春陌选,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹄溉。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工咨油, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柒爵。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓役电,卻偏偏與公主長得像,于是被迫代替她去往敵國和親棉胀。 傳聞我的和親對象是個殘疾皇子法瑟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容