Swift - 重寫UIKit框架類的init初始化方法(以UITabBarController爲例

Swift - 重寫UIKit框架類的init初始化方法(以UITabBarController爲例)

 

原來寫了篇文章講UITabBarController的用法,當時是從UIViewController跳轉到UITabBarController頁面,代碼以下:框架

1ide

self.presentViewController(MainTabViewController(), animated:true, completion:nil)函數


有網友問:若是跳轉的時候想給UITabBarController傳遞參數,要如何實現? 

方法1:能夠給UITabBarController實例對象的內部變量賦值ui

1spa

2code

3對象

4繼承

5ci

6編譯器

7

8

9

10

11

12

let tabController = MainTabViewController()

tabController.param = "這個是傳遞的參數"

self.presentViewController(tabController, animated:true, completion:nil)

 

class MainTabViewController:UITabBarController

{    

    var param:String?

     

    override func viewDidLoad()

    {       

    }

}


但若是咱們想要在頁面初始化的時候就要用到這個參數,好比viewDidLoad()中。那麼就要考慮下一種方法,在初始化方法中進行參數傳遞。 
方法2:重寫init初始化構造函數實現參數傳遞
對於UIKit框架類,不能像下面同樣簡單的重寫:

1

2

3

4

5

6

7

8

class MainTabViewController:UITabBarController

{    

    var param:String?

     

    init(param: String) {

        self.param = param        

    }

}

這樣編譯器會報以下錯誤:

‘required‘ initializer ‘init(coder:)‘ must be provided by subclass of ‘UITabBarController‘
Super.init isn‘t called before returning from initializer


緣由分析:

1,在 Swift 中, 類的初始化器有兩種, 分別是Designated Initializer(指定初始化器)和Convenience Initializer(便利初始化器)
2,若是子類沒有定義任何的指定初始化器, 那麼會默認繼承全部來自父類的指定初始化器。
3,若是子類提供了全部父類指定初始化器的實現, 那麼自動繼承父類的便利初始化器
4,若是子類只實現部分父類初始化器,那麼父類其餘的指定初始化器和便利初始化器都不會繼承。
5,子類的指定初始化器必需要調用父類合適的指定初始化器。


分析這兩個錯誤:
1,第一個錯誤由於init(coder aDecoder: NSCoder) 方法是來自父類的指定構造器, 由於這個構造器是 required, 必需要實現. 可是由於咱們已經重載了 init(), 定義了一個指定構造器, 因此這個方法不會被繼承, 要手動覆寫。
2,第二個錯是由於指定構造器必須調用它最近父類的指定構造器。 
最終正確的寫法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

class MainTabViewController:UITabBarController

{

     

    var param:String?

     

    init(param: String) {

        self.param = param        

        super.init(nibName: nil, bundle: nil)

    }

     

    required init?(coder aDecoder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }

     

    override func viewDidLoad()

    {      

    }

}

 

self.presentViewController(MainTabViewController(param: "這個是傳遞的參數"), animated:true

     completion:nil)

相關文章
相關標籤/搜索