亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ViewController詳解

2019-11-14 19:12:58
字體:
來源:轉載
供稿:網友

 

一、頁面跳轉
1、利用UINavigationController,調用pushViewController,進行跳轉;這種采用壓棧和出棧的方式,進行Controller的管理。調用popViewControllerAnimated方法可以返回。 

    PickImageViewController *ickImageViewController = [[PickImageViewController alloc] init]; 
    [self.navigationController pushViewController: ickImageViewController animated:true]; 
    [ickImageViewController release]; 


2、利用UIViewController自身的PResentViewController進行跳轉;調用dismissViewControllerAnimated方法可以返回。 
    PickImageViewController *ickImageViewController = [[PickImageViewController alloc] init]; 

[self presentViewController:ickImageViewController

                       animated:YES

                     completion:^(void){

                         // Code

                     

                     }];

 //返回
[self dismissViewControllerAnimated:YES

                             completion:^(void){

                                 // Code

                             }];

新接口的差別是提供了一個參數,允許你傳入一個block。這個block的回調方法在VC的viewWillDisappear方法后調用。也就是被隱藏的VC對象被釋放后運行回調。

二、生命周期

當一個視圖控制器被創建,并在屏幕上顯示的時候。 代碼的執行順序
1、 alloc                              創建對象,分配空間
2、init (initWithNibName)  初始化對象,初始化數據
3、loadView          從nib載入視圖 ,通常這一步不需要去干涉。除非你沒有使用xib文件創建視圖
4、viewDidLoad       載入完成,可以進行自定義數據以及動態創建其他控件
5、viewWillAppear                視圖將出現在屏幕之前,馬上這個視圖就會被展現在屏幕上了
6、viewDidAppear       視圖已在屏幕上渲染完成當一個視圖被移除屏幕并且銷毀的時候的執行順序,這個順序差不多和上面的相反
1、viewWillDisappear            視圖將被從屏幕上移除之前執行
2、viewDidDisappear     視圖已經被從屏幕上移除,用戶看不到這個視圖了
3、dealloc                            視圖被銷毀,此處需要對你在init和viewDidLoad中創建的對象進行釋放

關于viewDidUnload :在發生內存警告的時候如果本視圖不是當前屏幕上正在顯示的視圖的話,  viewDidUnload將會被執行,本視圖的所有子視圖將被銷毀,以釋放內存,此時開發者需要手動對viewLoad、viewDidLoad中創建 的對象釋放內存。 因為當這個視圖再次顯示在屏幕上的時候,viewLoad、viewDidLoad 再次被調用,以便再次構造視圖。

三、view的加載過程

文字說明在表述流程的時候總是很費力的,我又找到了如下的兩張圖

跟隨如下文字理解viewController對view加載過程:

1 先判斷子類是否重寫了loadView,如果有直接調用。之后調viewDidLoad完成View的加載。

2 如果是外部通過調用initWithNibName:bundle指定nib文件名的話,ViewController記載此nib來創建View。

3 如果initWithNibName:bundle的name參數為nil,則ViewController會通過以下兩個步驟找到與其關聯的nib。

A 如果類名包含Controller,例如ViewController的類名是MyViewController,則查找是否存在MyView.nib;

B 找跟ViewController類名一樣的文件,例如MyViewController,則查找是否存在MyViewController.nib。

4  如果子類沒有重寫的loadView,則ViewController會從StroyBoards中找或者調用其默認的loadView,默認的loadView返回一個空白的UIView對象。

注意第一步,ViewController是判斷子類是否重寫了loadView,而不是判斷調用子類的loadView之后 ViewController的View是否為空。就是說,如果子類重寫了loadView的話,不管子類在loadView里面能否獲取到 View,ViewController都會直接調viewDidLoad完成View的加載。

四、view卸載過程圖

跟隨以下文字理解卸載過程:

1 系統發出警告或者ViewController本身調用導致didReceiveMemoryWarning被調用

2 調用viewWillUnload之后釋放View

3 調用viewDidUnload

五、模擬器的調用順序

我構架了這樣一個環境,在該環境中有兩個viewController,姑且命名為A和B,tag分別為1和2,A控制程序啟動的時候即加載的界面,在A中放一個按鈕,按下后會通過segue來調用到界面B;B 中頁放一個按鈕,通過執行

[self dismissModalViewControllerAnimated:YES];

來返回界面A

然后檢測所有的函數調用,依次如下

加載A的時候依次調用

 

1 initWithCoder

1 loadView //如果說你進行了重寫,會在這里調用,這一步可以參考下文

1 viewDidLoad

1 viewWillAppear

1 viewWillLayoutSubviews

1 viewDidLayoutSubviews

1 viewDidAppear

 

切換至B的時候依次調用

 

2 initWithCoder             //先將2初始化

1 prepareForSegue       //調用1的準備過度的函數,所以在該函數中可以對界面B的一些相關屬性進行賦值

2 loadView    //如果這里進行了重寫

2 viewDidLoad              //2界面加載

1 viewWillDisappear

2 viewWillAppear

2 viewWillLayoutSubviews

2 viewDidLayoutSubviews

2 viewDidAppear

1 viewDidDisappear

 

從B切換回A的時候依次調用

 

2 viewWillDisappear

1 viewWillAppear

1 viewDidAppear

2 viewDidDisappear

2 dealloc

 

順序總結下來加載依次為:加載 - 顯示 - 布局

完成順序依次為:完成布局 - 完成顯示  - 完成加載

 

小注:-(void)loadView;函數如果重寫,下面是一個可能的demo

 

-(void)loadView

{

   CGRect applicationFrame = [[UIScreenmainScreen] applicationFrame];

   UIView *contentView = [[UIViewalloc] initWithFrame:applicationFrame];

   contentView.backgroundColor = [UIColordarkGrayColor];

   self.view = contentView;

   

   UILabel *lab = [[UILabelalloc]initWithFrame:CGRectMake(100, 100, 100, 100)];

   lab.text = @"HelloWorld";

   [self.viewaddSubview:lab];

}

 

loadView雖然返回值為空,但必須在函數體內對self.view進行賦值,否則會在建立該界面的時候收到如下的log信息:

Application windows are expected to have a root view controller at the end of application launch

具體執行順序為:代碼執行了initWithCoder之后直接調用了三次loadView函數,并且沒有調用其它函數(包括viewDidLoad 、viewWillDisappear、viewWillLayoutSubviews)

疑問:

暫不清楚為什么會調用三次,我的猜測是:上述三個函數分別檢測了一遍view是否存在,發現不存在,所以各自調用了一遍viewLoad,最后發現依然不存在,所以上述三個函數分別返回了失敗,加載完成

但矛盾的地方是:為什么上述三個函數本身沒有執行到?底層到底做了什么?

 

六、view和ViewController的創建階段,關于什么時候應該干什么

1、init

Allocating critical data structures required by your view controller

不要出現創建view的代碼。良好的設計,在init里應該只有相關數據的初始化,而且這些數據都是比較關鍵的數據。init里不要掉self.view,否則會導致viewcontroller創建view。(因為view是lazyinit的)。

2、loadView

Creating your view objects

只初始化view,一般用于創建比較關鍵的view如tableViewController的 tabView,UINavigationController的navgationBar,不可掉用view的getter(在掉super  loadView前),最好也不要初始化一些非關鍵的view。如果你是從nib文件中創建的viewController在這里一定要首先調用 super的loadView方法,但建議不要重載這個方法。

3、viewDidLoad 

Allocating or loading data to be displayed in your view

這時候view已經有了,最適合創建一些附加的view和控件了。有一點需要注意的是,viewDidLoad會調用多次(viewcontroller可能多次載入view,參見圖2)。

4、viewWillAppear 這個一般在view被添加到superview之前,切換動畫之前調用。在這里可以進行一些顯示前的處理。比如鍵盤彈出,一些特殊的過程動畫(比如狀態條和navigationbar顏色)。

5、viewDidAppear 一般用于顯示后,在切換動畫后,如果有需要的操作,可以在這里加入相關代碼。

6、viewDidUnload 

Releasing references to view objects

Releasing data that is not needed when your view is not displayed

這時候viewController的view已經是nil了。由于這一般發生在內存警告時,所以在這里你應該將那些不在顯示的view釋放了。比 如你在viewcontroller的view上加了一個label,而且這個label是viewcontroller的屬性,那么你要把這個屬性設置 成nil,以免占用不必要的內存,而這個label在viewDidLoad時會重新創建。

7、dealloc

Releasing critical data structures required by your view controller

七、幾點備注:

1、按結構可以對iOS的所有ViewController分成兩類:

1)、。主要用于展示內容的ViewController,這種ViewController主要用于為用戶展示內容,并與用戶交互,如UITableViewController,UIViewController

2)、用于控制和顯示其他ViewController的ViewController。這種ViewController一般都是一個 ViewController的容器。如UINavigationController,UITabbarController。它們都有一個屬 性:viewControllers。其中UINavigationController表示一種Stack式結構,push一個 ViewController或pop一次,因此后一個ViewController一般會依賴前一個ViewController。而 UITabbarController表示一個Array結構,各個ViewController是并列的。

第一種ViewController會經常被繼承,用來顯示不同的數據給用戶。而第二種很少被繼承,除非你真的需要自定義它。

2、由于Controller加載View時,會自動將一些View對象指向其對應的IBOutlet變量。

所以當view被卸載時我們必須在viewDidUnload將這些變量release掉,ViewController不會自動做這件事。

具體做法是將變量設置為空,(注意和dealloc中將變量release的區別)注意此時Controller的view屬性是空的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美最猛黑人xxxx黑人猛叫黄| 久久久久久久久久久av| 在线观看欧美日韩| 91精品国产亚洲| 日韩中文综合网| 欧美性一区二区三区| 影音先锋欧美精品| 亚洲成人精品视频| 欧美成人精品激情在线观看| 久久久在线视频| 久久在精品线影院精品国产| 97在线视频免费| 国产日产欧美a一级在线| 欧美激情亚洲精品| 7m第一福利500精品视频| 久久久久久久91| 黄色精品一区二区| 欧美成人第一页| 成人黄色在线播放| 亚洲精品久久久一区二区三区| 日韩av大片免费看| 国产福利精品视频| 97视频在线观看网址| 欧美成人在线免费| 国产噜噜噜噜噜久久久久久久久| 成人av在线天堂| 亚洲免费视频观看| 欧美精品激情blacked18| 欧美孕妇毛茸茸xxxx| 亚洲成年人在线播放| 欧美国产日韩二区| 亚洲深夜福利在线| 国色天香2019中文字幕在线观看| 亚洲图片欧美日产| 国内揄拍国内精品少妇国语| 欧美国产日韩免费| 成人av在线亚洲| 日韩视频―中文字幕| 日韩欧美国产网站| 国产999在线| 亚洲网址你懂得| 亚洲欧美国产精品久久久久久久| 国产美女精品视频免费观看| 日本一区二区三区四区视频| 欧美福利在线观看| 亚洲xxxx做受欧美| 日韩精品视频免费| 91日韩在线视频| 国产精品黄页免费高清在线观看| 亚洲成人网av| 亚洲区免费影片| 免费91在线视频| 国产精品看片资源| 久久精品视频网站| 欧美乱大交xxxxx另类电影| 欧美极品美女视频网站在线观看免费| 隔壁老王国产在线精品| 亚洲电影免费观看高清完整版在线观看| 亚洲精品国产精品国自产观看浪潮| 97视频在线观看成人| 国产97在线播放| 日韩有码视频在线| 欧美高清第一页| 欧美乱大交做爰xxxⅹ性3| 国产精品免费久久久久久| 欧美午夜宅男影院在线观看| 国产精品久久久久久久久| 性欧美暴力猛交69hd| 欧美日韩国产精品一区二区不卡中文| 精品久久久久国产| 国产成人综合久久| 91免费人成网站在线观看18| 国产精品日本精品| 国产精品日日摸夜夜添夜夜av| 午夜精品一区二区三区在线播放| 91免费国产网站| 成人观看高清在线观看免费| 欧美激情视频一区| 成人h片在线播放免费网站| 亚洲人a成www在线影院| 亚洲娇小xxxx欧美娇小| 日本午夜在线亚洲.国产| 夜夜嗨av一区二区三区免费区| 国产精品久久一| 色哟哟亚洲精品一区二区| 久久精品亚洲热| 久久福利网址导航| 亚洲欧美中文日韩在线v日本| 91久久精品一区| 日本不卡免费高清视频| 欧美日韩国产丝袜美女| 亚洲欧美国产日韩中文字幕| 久热精品在线视频| 亚洲国产高清福利视频| 欧美午夜片欧美片在线观看| 亚洲精品成人免费| 最近2019中文字幕第三页视频| 久久久久国产视频| 91夜夜揉人人捏人人添红杏| 亚洲变态欧美另类捆绑| 91久久精品在线| 亚洲午夜精品久久久久久久久久久久| 国产精品视频久久久久| 狠狠躁夜夜躁人人爽天天天天97| 精品久久久久久亚洲国产300| 日韩动漫免费观看电视剧高清| 成人国内精品久久久久一区| 久久成人人人人精品欧| 日本欧美一级片| 欧美精品成人91久久久久久久| 美女视频久久黄| 国产精品高潮呻吟久久av无限| 国产精品电影网站| 欧美性理论片在线观看片免费| 国产精品va在线| 中文字幕av一区二区三区谷原希美| 日韩欧美中文免费| 亚洲女在线观看| 亚洲精品资源在线| 久久精品久久久久久国产 免费| 国产成人在线一区二区| 亚洲电影免费观看高清完整版在线观看| 亚洲伊人一本大道中文字幕| 亚洲人午夜精品免费| 欧美床上激情在线观看| 国产偷亚洲偷欧美偷精品| 岛国av午夜精品| 国产精品成人久久久久| 精品久久久在线观看| 久久久久国产精品www| 欧美激情xxxxx| 欧美日韩美女在线| 欧美日韩成人在线视频| 久久久久九九九九| 岛国视频午夜一区免费在线观看| 中文字幕国产亚洲| 成人免费视频网| 亚洲二区在线播放视频| 国产精品一区二区女厕厕| 久久久久久久影院| 俺也去精品视频在线观看| 久久6精品影院| 国产精品第一区| 欧美性生活大片免费观看网址| 日韩电影中文字幕在线| 在线亚洲男人天堂| 久久久91精品国产一区不卡| 国产中文欧美精品| 亚洲精品在线91| 久久久999精品视频| 国产成人亚洲综合91| 57pao国产成人免费| 性欧美暴力猛交69hd| 韩国福利视频一区| 日韩欧美成人网| 亚洲精品一区在线观看香蕉| 中文欧美在线视频| 欧美一级免费视频| 亚洲美女av网站| 国产精品视频久久久久| 欧美精品久久久久久久| 日韩视频精品在线| 51精品在线观看| 亚洲经典中文字幕|