Override init method of UIView in swift

前端 未结 4 687
终归单人心
终归单人心 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:20

    You must call one of UIView's designated initializers at some point in your custom initializer, for instance: super.init(frame: frameX). Your call of super.init() does not satisfy this requirement.

    0 讨论(0)
  • 2020-12-28 09:24

    Foe me it was calling a xib that doesn't exist from custom view initialiser in Bundle.main.loadNibNamed("XibNameThatDoesntExist", owner: self, options: nil) `

    0 讨论(0)
  • 2020-12-28 09:31

    Try this:

    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")
        }
    }
    
    0 讨论(0)
  • 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.

    0 讨论(0)
提交回复
热议问题