Fatal error: init(coder:) has not been implemented in Swfit

1. 概述

平时的开发中,如果想创建一个继承于UIView的子类,弄不好就会出现“Fatal error: init(coder:) has not been implemented”这样的崩溃提示,今天本文将这个崩溃的解决方案记录于此。

在我们开发的过程中,经常自定义UIView的子类,以便封装一些UI组件等等,而在使用的时候,我们可以通过下面两种方法创建该类的实例:

  1. 纯代码创建。
  2. 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的博客,如需转载,请标明出处。

 

 

你可能感兴趣的:(iOS开发异常处理,iOS,Swift,Fatal,error)