Swift - 重写UIKit框架类的init初始化方法(以UITabBarController为例
2016-07-06 00:00
323 查看
Swift - 重写UIKit框架类的init初始化方法(以UITabBarController为例)
原来写了篇文章讲UITabBarController的用法,当时是从UIViewController跳转到UITabBarController页面,代码如下:1 | self .presentViewController( MainTabViewController (),animated: true ,completion: nil ) |
方法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() { } } |
方法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 ) |
相关文章推荐
- iOS 实现脉冲雷达以及动态增减元素 By Swift-感谢分享
- ReactiveCocoa / RxSwift 笔记一
- swift教程【入门】 使用swift REPL编写第一个swift程序
- SWIFT实现图文混排
- Swift一些语法
- Swift 2.2 基础笔记
- 详解Swift中的下标访问用法
- iOS_Swift_函数初识
- iOS_Swift_条件语句
- 【Swift】从前台进入后台,从后台进入前台
- Swift - 本地数据的保存与读取(使用NSCoder将对象保存到.plist文件)
- Swift开发中的一些琐碎
- iOS_Swift_元组
- Beginning iOS Animation Series (Swift 2)
- swift 3官方文档(读后感)
- nil和Nil的区别
- Swift基础之UIImageView(都是2.2版本)
- Swift基础之UIImageView(都是2.2版本)
- iOS_Swift_集合数据类型
- swift 将json字符串 转换成 字典