class CustomView: UIView {
var subViewColor:UIColor
var subViewMessage:String
override init(frame:CGRect) {
super.init(frame:frame)
}
init(subViewColor:UIColor,subViewMessage:String){
self.subViewColor = subViewColor
self.subViewMessage = subViewMessage
super.init()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
次のようなプロパティを指定して、ユーザーにカスタムビューを初期化させたいクラスがあります。
let myView = CustomLoadingView(initialize properties here)
ユーザーが独自のプロパティを初期化したくない場合、デフォルトのプロパティを使用してCustomLoadingView
を初期化します...
let myView = CustomLoadingView() // this should initialize using default value
しかし、これでは、このエラーが発生しています:
スーパークラスUIViewの指定された初期化子を呼び出す必要があります
init(subviewColor: UIColor, subViewMessage: String)
では、指定された初期化子を呼び出していません(コンパイラーがうまく指摘しているため)。
指定された初期化子が何かわからない場合、それらはhaveが何らかの時点でサブクラスによって呼び出される初期化子です。ドキュメントから:
指定された初期化子は、クラスの主要な初期化子です。指定されたイニシャライザは、そのクラスによって導入されたすべてのプロパティを完全に初期化し、適切なスーパークラスイニシャライザを呼び出して、スーパークラスチェーンまでの初期化プロセスを続行します。
この場合、UIView
に指定された初期化子はinit(frame: CGRect)
です。これは、ある時点で、新しい初期化子_init(subviewColor: UIColor, subViewMessage: String
_がsuper.init(frame:)
を呼び出す必要があることを意味します。
これを修正するには、次の変更を行います。
_init(frame: CGRect, subViewColor: UIColor, subViewMessage: String){
self.subViewColor = subViewColor
self.subViewMessage = subViewMessage
super.init(frame: frame)
}
_
または、クラス内の他の初期化子を呼び出して、指定された初期化子を呼び出すことができます。
_override init(frame: CGRect) {
super.init(frame: frame) // calls designated initializer
}
convenience init(frame: CGRect, subViewColor: UIColor, subViewMessage: String){
self.subViewColor = subViewColor
self.subViewMessage = subViewMessage
self.init(frame: frame) // calls the initializer above
}
_
単にCustomLoadingView()
を使用する便利なメソッドについては、そのための別のイニシャライザーを追加する必要があります。このコードをカスタムビューに追加します。
_convenience init() {
self.init(frame: DEFAULT_FRAME, subViewColor: DEFAULT_COLOR, subViewMessage: DEFAULT_MESSAGE)
}
_
指定イニシャライザと便利なイニシャライザについて詳しく知りたい場合は、それらについて here および here をお読みください。
これを試して:
class CustomView: UIView {
var subViewColor:UIColor
var subViewMessage:String
init(subViewColor:UIColor,subViewMessage:String){
self.subViewColor = subViewColor
self.subViewMessage = subViewMessage
let frame = self.frame
//Or you can use custom frame.
super.init(frame: frame)
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
敵対するBundle.main.loadNibNamed("XibNameThatDoesntExist", owner: self, options: nil)
`のカスタムビュー初期化子から存在しないxibを呼び出していた
カスタム初期化子のある時点で、UIViewの指定された初期化子の1つを呼び出す必要があります。たとえば、super.init(frame: frameX)
です。 super.init()
の呼び出しは、この要件を満たしていません。