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)

相关文章
相关标签/搜索