我正在尝试构建一个自定义UIView,并且在初始化时就丢失了。
Code One
class CustomUIView: UIView {
var propertyToInitialize: CGRect
//Custom Initializer
override init(frame: CGRect) {
self.propertyToInitialize = CGRect(x: 0, y: 0, width: (superview?.frame.size.width)!, height: (superview?.frame.size.height)!)
super.init(frame: frame)
}
}
当我使用上面的代码时,XCode给出的错误如下。
错误
Use of 'self' property access 'superview' before super.init initializes self
所以我修改了我的代码
代码二
class CustomUIView: UIView {
var propertyToInitialize: CGRect
//Custom Initializer
override init(frame: CGRect) {
self.propertyToInitialize = CGRect()
super.init(frame: frame)
self.propertyToInitialize = CGRect(x: 0, y: 0, width: (superview?.frame.size.width)!, height: (superview?.frame.size.height)!)
}
}
问题
这是一个糟糕的设计吗?我应该采取不同的方法吗?我是否因此使用更多内存来初始化属性两次?
答案 0 :(得分:2)
整件事情是糟糕的设计。使didMoveToSuperview
成为一个包装CGRect的可选项,以便在初始化时不需要值,并将代码移动到视图的{{1}},这是超级视图概念的第一个时刻有任何意义。更好的是,不要把它作为财产;可以在需要此信息的任何时候检查超级视图,因此在属性中复制它是没有意义的。
答案 1 :(得分:1)
我发现对我来说最好的方法是。
<强>代码强>
class CustomUIView: UIView {
lazy var propertyToInitialize: CGRect = self.initializeProperty()
//Custom Initializer
override init(frame: CGRect) {
super.init(frame: frame)
}
func initializeProperty() -> CGRect {
let rect: CGRect = CGRect(x: 0, y: 0, width: (superview?.frame.size.width)!, height: (superview?.frame.size.height)!)
return rect
}
}
我认为这是最好的答案,因为在需要之前我不会使用该属性。并且,仍然可以获得超视图大小,但不必双初始化。
答案 2 :(得分:0)
您需要先调用super.init
,然后才能访问self
中的任何属性,并将其置于完全不同的功能中。
class CustomUIView: UIView {
var propertyToInitialize: CGRect?
init(frame: CGRect, property: CGRect) {
super.init(frame: frame)
self.propertyToInitialize = property
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
//Decode propertyToInitialize
}
}