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


原來寫了篇文章講UITabBarController的用法,當時是從UIViewController跳轉到UITabBarController頁面,代碼如下:
1
self .presentViewController( MainTabViewController (), animated: true , completion: nil )

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

方法1:可以給UITabBarController實例對象的內部變量賦值
1
2
3
4
5
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 )


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM