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