原來寫了篇文章講UITabBarController的用法,當時是從UIViewController跳轉到UITabBarController頁面,代碼以下:框架
1ide |
|
有網友問:若是跳轉的時候想給UITabBarController傳遞參數,要如何實現?
方法1:能夠給UITabBarController實例對象的內部變量賦值ui
1spa 2code 3對象 4繼承 5ci 6編譯器 7 8 9 10 11 12 |
|
但若是咱們想要在頁面初始化的時候就要用到這個參數,好比viewDidLoad()中。那麼就要考慮下一種方法,在初始化方法中進行參數傳遞。
方法2:重寫init初始化構造函數實現參數傳遞
對於UIKit框架類,不能像下面同樣簡單的重寫:
1 2 3 4 5 6 7 8 |
|
這樣編譯器會報以下錯誤:
‘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 |
|