这样编译器会报如下错误:
'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,第二个错是因为指定构造器必须调用它最近父类的指定构造器。
最终正确的写法:
原来写了篇文章讲UITabBarController的用法,当时是从UIViewController跳转到UITabBarController页面,代码如下:1self.presentViewController(MainTabViewController(), animated:true, completion:nil)
Swift
构造函数
子
类
重写
父
类
构造
方法
: 如果父
类
没有指定构造
方法
(带参数的构造
方法
), 子
类
重写
父
类
构造
方法
就不需要调用super的构造
方法
, 反之亦然(如果父
类
有指定构造
方法
, 子
类
重写
的构造
方法
中必须显示调用父
类
构造
方法
):
class Animal {
var name: String
var age: Int
init
() {
name = "D...
Swift
有着超级严格的
初始化
方法
,不仅强化了designated
初始化
方法
的地位,所有不加修饰的
init
方法
都需要在
方法
中确保非Optional的实例变量被赋值
初始化
,而在子
类
中,也强制调用super版本的designated
初始化
。
我们在深入
初始化
方法
之前,不妨先再想想
Swift
中的
初始化
想要达到一种怎样的目的。
其实就是安全。在Objective-C中,
init
方法
是非常不
在OC中我们直接复写
init
方法
- (instancetype)
init
WithLeftView
Controller
:(
UI
View
Controller
*)leftView
Controller
contentView
Controller
:(
UI
View
Controller
*)contentView
Controller
{
if (self = [super
init
]) {
// Coding
return self;
在
Swift
中这样写
重写
是相同
方法
的不同实现,参数不同
方法
就不同了,楼主是想重载,如下两个例子可以清晰表现用法和区别:
例如
UI
View
重写
父
类
的
init
(frame: CGRect)
方法
:
override
init
(frame: CGRect) {
super.
init
(frame: frame)
//do something what you want
重写
的话
swift
规定不可以缺少这个
Swift
自定义View和OC自定义View的原理都是一样的,
重写
init
()
方法
或
init
WithFrame()
方法
,下面简单说说如何自定义
swift
UI
View
主要是
重写
init
(frame:CGRect)
方法
,其中req
ui
red
init
?(coder aDecoder: NSCoder) 是必不可少的,
swift
语言强制要求的
// LoginImgFieldView.s
1,在
Swift
中,
类
的
初始化
器有两种,
分别是Designated
Init
ializer(指定
初始化
器)和Convenience
Init
ializer(便利
初始化
器)
2,如果子
类
没有定义任何的指定
初始化
器,那么会默认继承所有来自父
类
的指定
初始化
器。
3,如果子
类
提供了所有父
类
指定
初始化
器的实现,那么自动继承父
类
UI
View
Controller
类
及其子
类
的
初始化
方法
调用不同于普通的
swift
类
,不是简单的
init
()即可,下面来看其
初始化
的调用写法。
class View
Controller
:
UI
View
Controller
{
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from
问题描述:
1.在View
Controller
的xib 视图中 拖了控件, 也关联到了 VC.
swift
(View
Controller
.
swift
以下简称VC) 中,但是,出现在viewDidLoad
方法
中未打印出来的控件是nil (未
初始化
) ----- ios 8.3 系统 (测试机低版本系统只有这一个)
ios 10.3.3
ios 8.3 系统版本问题产生的BU...
如果在你的
Swift
代码中遇到了 "No such module
UIKit
" 的错误,通常是因为在你的代码中使用了
UIKit
模块中的
类
或
方法
,但是在你的项目中没有导入
UIKit
模块。
要解决这个问题,可以在你的代码文件的顶部添加 import
UIKit
语句,然后再次编译你的代码。
例如,如果你的代码文件中使用了
UI
Button
类
,你可以这样写:
import
UIKit
class View
Controller
:
UI
View
Controller
{
override func viewDidLoad() {
super.viewDidLoad()
let button =
UI
Button(frame: CGRect(x: 0, y: 0, width: 100, height: 50))
button.setTitle("Button", for: .normal)
view.addSubview(button)
这样就可以解决 "No such module
UIKit
" 的错误了。