代码之家  ›  专栏  ›  技术社区  ›  rantanplan

子类化UIView

  •  -4
  • rantanplan  · 技术社区  · 7 年前

    class ProgressAlertView: UIView {
    
        var title: String
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            alertLayout()
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            alertLayout()
        }
    
        convenience init(title: String) {
            self.title = title
            self.init(title: title)
        }
    }
    

    上面的代码将导致多个错误消息,其中包括便利init中我的变量title的错误消息:“self”用于“self.init”调用之前的属性访问“title”

    然而,Swift要求在一个初始化其他实例变量之后,必须调用超类中的所有初始化器。所以错误一定在别的地方。

    非常感谢你给我的小费。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ashley Mills    7 年前

    想想你希望在未来发生什么

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

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

    您有一个非可选的实例变量 title

    在你的第三个 init

    convenience init(title: String) {
        self.title = title
        self.init(title: title)
    }
    

    init(title: String) 电话 ,反过来 等等。你在无限递归区域。

    如果要在代码中实例化视图,则需要

    init(title: String, frame: CGRect) {
        self.title = title
        super.init(frame: frame)
        alertLayout()
    }
    

    你还需要实施

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    

    如果你在故事板/笔尖中使用这个,那么你需要

    required init?(coder aDecoder: NSCoder) {
        self.title = ""
        super.init(coder: aDecoder)
    }
    

    然后给