博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift - 重写UIKit框架类的init初始化方法(以UITabBarController为例)
阅读量:6326 次
发布时间:2019-06-22

本文共 1845 字,大约阅读时间需要 6 分钟。

原来写了篇文章讲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
)

转载地址:http://fngaa.baihongyu.com/

你可能感兴趣的文章
初识GO语言——安装Go语言
查看>>
SDK命令行操作
查看>>
基于Bootstrap的DropDownList的JQuery组件的完善版
查看>>
EXTJS学习系列提高篇:第二十四篇(转载)作者殷良胜,ext2.2打造全新功能grid系列--阅增删改篇...
查看>>
Hadoop MapReduce编程 API入门系列之分区和合并(十四)
查看>>
判断二叉树是否平衡、是否完全二叉树、是否二叉排序树
查看>>
并查集的应用之求解无向图中的连接分量个数
查看>>
7个神奇的jQuery 3D插件
查看>>
在线浏览PDF之PDF.JS (附demo)
查看>>
波形捕捉:(3)"捕捉设备"性能
查看>>
AliOS Things lorawanapp应用介绍
查看>>
美国人的网站推广方式千奇百怪
查看>>
java web学习-1
查看>>
用maven+springMVC创建一个项目
查看>>
linux设备驱动第四篇:以oops信息定位代码行为例谈驱动调试方法
查看>>
redis知识点整理
查看>>
Hello World
查看>>
Spring3全注解配置
查看>>
ThreadLocal真会内存泄露?
查看>>
IntelliJ IDEA
查看>>