web-dev-qa-db-ja.com

swiftでUIViewのinitメソッドをオーバーライドします

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の指定された初期化子を呼び出す必要があります

12
user4790024

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 をお読みください。

35
tktsubota

これを試して:

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")
    }
}
1
TechBee

敵対するBundle.main.loadNibNamed("XibNameThatDoesntExist", owner: self, options: nil) `のカスタムビュー初期化子から存在しないxibを呼び出していた

0
Michal Shatz

カスタム初期化子のある時点で、UIViewの指定された初期化子の1つを呼び出す必要があります。たとえば、super.init(frame: frameX)です。 super.init()の呼び出しは、この要件を満たしていません。

0
sakurasunris3