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

Swift - 重写UIKit框架类的init初始化方法(以UITabBarController为例)的更多相关文章

  1. UIKit框架类层次图

    学习UIKit应该首选了解UIKit类的层次图,从根类一层一层的拨.

  2. swift重写导航控制器类的 initialize 方法

    //这个方法,是当这个类第一次被创建时调用,且只调用一次 override class func initialize() { let navBar = UINavigationBar.appeara ...

  3. [New learn] UIKit 框架类

    NSObject NSObject is the root class of most Objective-C class hierarchies. NSDataAsset The NSDataAss ...

  4. [iOS]为什么不要在init初始化方法里调用self.view

    首先.如果你调用self.view的时候,就会调用view的getter方法, 这个时候,view是空的,那么系统就会自动给你创建一个view,然后就会触发ViewDidLoad方法.那么这个时候,如 ...

  5. Java在的时候,类定义HashSet初始化方法

    Java非常多的时间,应使用HashSet搜索功能,类的则定义,是HashSet类型的,我们定义数据成员之后,不好直接调用add函数来实现初始化,这个时候怎么办? 我们能够这样来做: public s ...

  6. 苹果公司的新的编程语言 Swift 高级语言(十一)--初始化类的析构函数的一个实例

    一 .实例的初始化          实例的初始化是准备一个类.结构或枚举的实例以便使用的过程. 初始化包含设置一个实例的每个存储属性为一个初始值,以及运行不论什么其他新的实例可以使用之前须要的设置或 ...

  7. Objective-C学习笔记(二十二)——初始化方法init的重写与自己定义

    初学OC.对init这种方法不是非常了解.我们如今来分别对init方法进行重写以及自己定义,来加深对他的了解. 本样例也是用Person类来进行測试. (一)重写init方法. (1)在Person. ...

  8. Webwork 学习之路【03】核心类 ServletDispatcher 的初始化

    1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...

  9. Webwork【03】核心类 ServletDispatcher 的初始化

    1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...

随机推荐

  1. iOS 10 开发问题总结

    兼容iOS 10 资料整理笔记   1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大 ...

  2. c++ 宏定义声明类,并在类中实现回调

    #include <iostream> #include <windows.h> #include <string> using namespace std; ty ...

  3. C# Json传值与解析

    最近接触了工作室的项目,觉得一个功能的实现有点不好,心想不能就动手改了下,做了才知道我的js是多么的渣,功能是这样的: 我要实现的功能就是当选择学院时,就放松get请请求到后台,后台返回json信息再 ...

  4. redis主从复制配置

    master配置 主要是下面配置 # ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the # intern ...

  5. php面试 1013总结

    面试题1:http://www.docin.com/p-288430879.html 数据库优化: session和cookies区别 缓存系统有哪些 myisam和InDB读写区别 varchar和 ...

  6. 初识 Html5

    1.1认识HTML5 HTML5并不仅仅只是做为HTML标记语言的一个最新版本,更重要的是它制定了Web应用开发的一系列标准,成为第一个将Web做为应用开发平台的HTML语言. HTML5定义了一系列 ...

  7. jquery的each

    each()方法能使DOM循环结构简洁,不容易出错.each()函数封装了十分强大的循环功能,使用也很方便,它可以循环一维数组.多维数组.DOM, JSON 等等在javaScript开发过程中使用$ ...

  8. python serial 获取所有的串口名称

    http://blog.csdn.net/qq61394323/article/details/44619511 #!/usr/bin/env python # -*- coding: utf-8 - ...

  9. shared_ptr

    省去对象指针的显示delete typedef tr1::shared_ptr<int> IntPtr; IntPtr fun() { IntPtr p = new int(3); ret ...

  10. MySQL 子分区

    200 ? "200px" : this.width)!important;} --> 介绍 子分区其实是对每个分区表的每个分区进行再次分隔,目前只有RANGE和LIST分区 ...