【问题标题】:Swift UIView subclass init failingSwift UIView 子类初始化失败
【发布时间】:2018-07-23 17:08:36
【问题描述】:

我创建了一个 UIView 子类:

class RA_Circle: UIView {

        let elipseWidth:CGFloat
        let elipseHeight:CGFloat

        init(elipseWidth: CGFloat, elipseHeight:CGFloat) {

            self.elipseWidth = elipseWidth
            self.elipseHeight = elipseHeight

            super.init(frame: CGRect.zero)

        }

        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }

    }

但是编译器在所需的初始化时给了我这个错误:

属性 'self.elipseWidth' 未在 super.init 调用时初始化

我一直在关注这个 SO Q&A:

How to properly init passed property in subclass of UIView?

【问题讨论】:

  • 错误很明显。你需要在调用super.init之前初始化你的两个属性。

标签: swift uiview


【解决方案1】:

在您的类定义中,您声明的变量没有任何默认值,并且所需的初始化程序在调用 super init 之前未提供任何值。

有很多方法可以解决这个问题,这里有一些......

一种方法是在属性声明中提供默认值:

var elipseWidth: CGFloat = 0.0
var elipseHeight: CGFloat = 0.0

第二个是让你的属性可选:

var elipseWidth: CGFloat?
var elipseHeight: CGFloat?

第三个是在所需的初始化器中提供默认值:

required init?(coder aDecoder: NSCoder) {
    elipseWidth = 14.0
    elipseHeight = 14.0
    super.init(coder: aDecoder)
}

【讨论】:

    【解决方案2】:

    您必须将 let 变量声明更改为 var 和可选的。在这种情况下,您可以在 awakeFromNib() 或稍后的某个时间初始化它们。

    【讨论】:

    • 这只是一种可能的解决方案。还有其他几种解决方案。
    猜你喜欢
    • 1970-01-01
    • 2014-08-04
    • 2018-05-15
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多