Override init method of UIView in swift

前端 未结 4 688
终归单人心
终归单人心 2020-12-28 08:56
class CustomView: UIView {

    var subViewColor:UIColor
    var subViewMessage:String

    override init(frame:CGRect) {
        super.init(frame:frame)
    }

             


        
4条回答
  •  生来不讨喜
    2020-12-28 09:41

    In init(subviewColor: UIColor, subViewMessage: String), you aren't calling the designated initializer (as the compiler points out nicely).

    If you don't know what designated initializers are, they are initializers that have to be called by the subclass at some point. From the docs:

    Designated initializers are the primary initializers for a class. A designated initializer fully initializes all properties introduced by that class and calls an appropriate superclass initializer to continue the initialization process up the superclass chain.

    In this case, the designated initializer for UIView is init(frame: CGRect), meaning at some point, your new initializer init(subviewColor: UIColor, subViewMessage: String must call super.init(frame:).

    In order to fix this, make the following changes:

    init(frame: CGRect, subViewColor: UIColor, subViewMessage: String){
    
        self.subViewColor = subViewColor
        self.subViewMessage = subViewMessage
        super.init(frame: frame)
    
    }
    

    OR you can call your other initializer in your class which ends up calling the designated initializer.

    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
    
    }
    

    As for the convenience method with simply CustomLoadingView(), you have to add another initializer for that. Add this code to your custom view:

    convenience init() {
        self.init(frame: DEFAULT_FRAME, subViewColor: DEFAULT_COLOR, subViewMessage: DEFAULT_MESSAGE)
    }
    

    If you want to learn more about designated and convenience initializers, read about them here and here.

提交回复
热议问题