Swift - UIViewController生命週期詳解(附:VC相關方法介紹)

 

UIViewController(視圖控制器)想必你們都不會陌生,開發中經常會用到。此次講講它的生命週期。html

 

1,視圖的生命週期swift

說是 ViewController 的生命週期,其實指的是它控制的視圖(View)的生命週期。每當視圖的狀態發生變化時,視圖控制器會自動調用一系列方法來響應變化。app

經過這些方法,咱們就能夠跟蹤到視圖的整個生命週期。各個方法按執行順序排列以下:ide

 

(1)init:初始化程序函數

 

(2)loadView:視圖初始化測試

這個方法不該該被直接調用,而是由系統自動調用。它會加載或建立一個 view 並把它賦值給 UIViewController 的 view 屬性。spa

同時重寫 loadView 方法的時候,不要調用父類的方法。code

 

(3)viewDidLoad:視圖加載完成,但還沒在屏幕上顯示出來orm

咱們能夠重寫這個方法,對 view 作一些其餘的初始化工做。好比能夠移除一些視圖,修改約束,加載數據等。htm

 

(3)viewWillAppear:在視圖即將顯示在屏幕上時調用

咱們能夠在這個方法裏,改變當前屏幕方向或狀態欄的風格等。

 

(4)viewDidApper:在視圖顯示在屏幕上時調用時調用

咱們能夠在這個方法中,對視圖作一些關於展現效果方面的修改。

 

(5)viewWillDisappear:視圖即將消失、被覆蓋或是隱藏時調用

 

(6)viewDidDisappear:視圖已經消失、被覆蓋或是隱藏時調用

 

(7)viewVillUnload:當內存太低時,須要釋放一些不須要使用的視圖時,即將釋放時調用

(8)viewDidUnload:當內存太低,釋放一些不須要的視圖時調用。

注意:自 iOS6 起,viewWillUnload 和 viewDidUnload 這兩個方法被廢除了。當系統發出內存警告的時候,會自動把 view 給清除掉,不用咱們再特別處理。

同時系統還會調用 didReceiveMemoryWarning 方法通知視圖控制器,咱們能夠在這裏面進行一些操做,來釋放一些額外的資源。(一般來講不用操做,比較最佔資源的 view 已經被系統給清理了。)

 

2,視圖狀態的轉換

在實際應用中,視圖一般不會按照上面列的流程一次執行下來,可能會在可見與不可見的狀態間互相轉換。好比一開始視圖是可見的,接着咱們跳轉到另外一個 ViewController,這時原來視圖就變成不可見的。後面咱們又跳轉回來,那麼這個視圖就又是可見的。

當視圖的可見性發生變化時,視圖控制器對應的方法也會隨之響應。具體可見下圖:

原文:Swift - UIViewController生命週期詳解(附:VC相關方法介紹)

特別要注意的是:Appearing 和 Disappearing 這兩個狀態是能夠互相轉化的。

 

3,測試樣例說明

(1)ViewController 是首頁視圖控制器,咱們將裏面全部的與生命週期有關的函數都打印出來。
(2)同時 ViewController 中添加了一個「跳轉」按鈕,點擊後跳轉到另外一個視圖控制器(AnotherViewController)。
(3)AnotherViewController 裏有個「返回」按鈕,點擊又會回到前一個頁面。

原文:Swift - UIViewController生命週期詳解(附:VC相關方法介紹)



4,測試代碼 (1)ViewController.swift

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

import UIKit

 

class ViewControllerUIViewController {

     

    //視圖初始化

    override func loadView() {

        super.loadView()

        print("loadView")

    }

     

    //視圖加載完成

    override func viewDidLoad() {

        super.viewDidLoad()

        print("viewDidLoad")

         

        //建立跳轉按鈕

        let button:UIButton UIButton(type: .System)

        button.frame=CGRectMake(10, 50, 100, 30)

        button.setTitle("跳轉", forState: .Normal)

        button.addTarget(self,action:#selector(jump),forControlEvents:.TouchUpInside)

        self.view.addSubview(button);

    }

     

    //視圖將要出現的時候執行

    override func viewWillAppear(animated: Bool) {

        print("viewWillAppear")

    }

     

    //視圖顯示完成後執行

    override func viewDidAppear(animated: Bool) {

        print("viewDidAppear")

    }

     

    //視圖將要消失的時候執行

    override func viewWillDisappear(animated: Bool) {

        print("viewWillDisappear")

    }

     

    //視圖已經消失的時候執行

    override func viewDidDisappear(animated: Bool) {

        print("viewDidDisappear")

    }

     

    //收到內存警告時執行

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

    }

     

    //跳轉到另外一個視圖

    func jump(){

        print("點擊按鈕,開始跳轉!")

        let anotherVC = AnotherViewController()

        presentViewController(anotherVC, animated: true, completion: nil)

    }

}

(2)AnotherViewController.swift

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

import UIKit

 

class AnotherViewControllerUIViewController {

 

    override func viewDidLoad() {

        super.viewDidLoad()

 

        //建立返回按鈕

        let button:UIButton UIButton(type: .System)

        button.frame=CGRectMake(10, 150, 100, 30)

        button.setTitle("返回", forState: .Normal)

        button.addTarget(self,action:#selector(back),forControlEvents:.TouchUpInside)

        self.view.addSubview(button);

    }

     

    //返回以前視圖

    func back(){

        print("點擊按鈕,開始返回!")

        self.dismissViewControllerAnimated(true, completion: nil)

    }

 

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

    }

}


5,運行測試
咱們從 ViewController 跳到 AnotherViewController,再從 AnotherViewController 跳回 ViewController。整個控制檯打印出來的流程以下:

原文:Swift - UIViewController生命週期詳解(附:VC相關方法介紹)

相關文章
相關標籤/搜索