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的博客,如需转载,请标明出处。