【问题标题】:Override init method of UIView in swift在swift中覆盖UIView的init方法
【发布时间】:2016-05-31 12:48:34
【问题描述】:
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 的指定初始化器

【问题讨论】:

    标签: ios swift uiview swift2


    【解决方案1】:

    init(subviewColor: UIColor, subViewMessage: String) 中,您没有调用指定的初始化程序(正如编译器很好地指出的那样)。

    如果你不知道什么是指定初始化器,它们是必须在某个时候被子类调用的初始化器。来自文档:

    指定初始化器是类的主要初始化器。指定的初始化程序完全初始化该类引入的所有属性,并调用适当的超类初始化程序以继续沿超类链的初始化过程。

    在这种情况下,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)
    }
    

    如果您想了解有关指定初始化器和便利初始化器的更多信息,请阅读它们herehere

    【讨论】:

    • 这仅适用于我在 convenience init 方法中首先调用 self.init(frame: frame)
    【解决方案2】:

    您必须在自定义初始化程序中的某个位置调用 UIView 的指定初始化程序之一,例如:super.init(frame: frameX)。您拨打的super.init() 不满足此要求。

    【讨论】:

      【解决方案3】:

      对我来说,它正在调用一个从自定义视图初始化程序中不存在的 xib Bundle.main.loadNibNamed("XibNameThatDoesntExist", owner: self, options: nil) `

      【讨论】:

        【解决方案4】:

        试试这个:

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

        【讨论】:

        • 产生编译器错误:'self' used before super.init callSee this answer.
        • 在调用超级函数之前不能使用self
        猜你喜欢
        • 1970-01-01
        • 2018-11-18
        • 1970-01-01
        • 2014-12-04
        • 1970-01-01
        • 2015-03-26
        • 1970-01-01
        • 1970-01-01
        • 2014-08-22
        相关资源
        最近更新 更多