原來寫了篇文章講UITabBarController的用法,當時是從UIViewController跳轉到UITabBarController頁面,代碼如下:
有網友問:如果跳轉的時候想給UITabBarController傳遞參數,要如何實現?
方法1:可以給UITabBarController實例對象的內部變量賦值
但如果我們想要在頁面初始化的時候就要用到這個參數,比如viewDidLoad()中。那么就要考慮下一種方法,在初始化方法中進行參數傳遞。
方法2:重寫init初始化構造函數實現參數傳遞
對於UIKit框架類,不能像下面一樣簡單的重寫:
這樣編譯器會報如下錯誤:
原因分析:
分析這兩個錯誤:
1,第一個錯誤因為init(coder aDecoder: NSCoder) 方法是來自父類的指定構造器, 因為這個構造器是 required, 必須要實現. 但是因為我們已經重載了 init(), 定義了一個指定構造器, 所以這個方法不會被繼承, 要手動覆寫。
2,第二個錯是因為指定構造器必須調用它最近父類的指定構造器。
最終正確的寫法:
|
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
Super.init isn't called before returning from initializer
原因分析:
1,在 Swift 中, 類的初始化器有兩種, 分別是Designated Initializer(指定初始化器)和Convenience Initializer(便利初始化器)
2,如果子類沒有定義任何的指定初始化器, 那么會默認繼承所有來自父類的指定初始化器。
3,如果子類提供了所有父類指定初始化器的實現, 那么自動繼承父類的便利初始化器
4,如果子類只實現部分父類初始化器,那么父類其他的指定初始化器和便利初始化器都不會繼承。
5,子類的指定初始化器必須要調用父類合適的指定初始化器。
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
)
|
