1. 概述
平时的开发中,如果想创建一个继承于UIView的子类,弄不好就会出现“Fatal error: init(coder:) has not been implemented”这样的崩溃提示,今天本文将这个崩溃的解决方案记录于此。
在我们开发的过程中,经常自定义UIView的子类,以便封装一些UI组件等等,而在使用的时候,我们可以通过下面两种方法创建该类的实例:
- 纯代码创建。
- xib创建(通过往xib拖进一个UIView,并指定其类为我们自定义的类)。
2. 纯代码创建
第一种方式创建,则自定义的类中需要实现init(frame: CGRect)方法,并在该方法中调用super方法,但是一旦实现了这个init(frame: CGRect)方法,Xcode立即报错,提示我们还需要实现一个方法,那就是required init?(coder: NSCoder)方法,否则编译无法通过。
两个方法都实现后,编译通过,此时我们就可以在实现init(frame: CGRect)方法里面调用配置UI的方法了。参考示例如下:
class ReflectionView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setUp()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setUp() {
// 配置UI内容代码
}
}
3. xib创建
上面纯代码创建实例为什么就强制要求实现required init?(coder: NSCoder)方法呢?因为这个方法是通过xib创建实例的时候系统要调用的方法,苹果可能考虑到不同的创建实例方式,所以在继承UIView的子类里面,要求实现其所有必要的初始化方法。
所以说我们还需要将required init?(coder: NSCoder)方法进行改进一下,去掉fatalError提示,增加super调用的方法。示例代码如下:
class ReflectionView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setUp()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setUp()
}
func setUp() {
// 配置UI内容代码
}
}
这种写法就满足了两种方式创建一个继承于UIView的子类。
还有一种可能就是自定义的类根本不需要纯代码创建,就是通过xib创建,那么我们也可以不实现上面的两个初始化方法,而是实现awakeFromNib()方法。
class ReflectionView: UIView {
override func awakeFromNib() {
super.awakeFromNib()
setUp()
}
func setUp() {
// 配置UI内容代码
}
}
4. 总结
本文主要说明了一下创建一个继承于UIView的子类的初始化方法的使用,如何避免不小心就会出现的Fatal error: init(coder:) has not been implemented报错提示。为了使我们创建的类更加灵活,还是建议使用两个初始化方法的方式去构建一个类。
文章有些简单,不过为了加深印象,避免自己再犯错误,同时也希望能帮助到有需要的人,还是有必要记录一下的。
以上内容如果不正确的地方,还请路过的朋友指正,谢谢!
本篇文章出自https://blog.csdn.net/guoyongming925的博客,如需转载,请标明出处。