天天看點

Fatal error: init(coder:) has not been implemented in Swfit1. 概述2. 純代碼建立3. xib建立4. 總結

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的部落格,如需轉載,請标明出處。