我知道这个问题已经问了很多遍了,但是我找不到解决我所面临问题的答案。所以这就是我正在做的。
我为注册表单创建了一个笔尖(RegisterView
),表单中的每个文本字段(RoundedTextfield
)也是我创建的一个笔尖。我遇到的问题是,调用RegisterView.awakFromNib()
时,所有插座都已设置好,但是当我进行配置时,插座的插座不会导致崩溃。我对awakeFromNib
的理解是,有一个合理的期望,即在调用awakeFromNib
时要设置和初始化所有出口……但是似乎在嵌套的笔尖出口中,孩子的出口是延迟加载,因此在尝试访问它们时导致崩溃。
RegisterView
import UIKit
class RegisterView: UIView {
@IBOutlet var blurView: UIVisualEffectView!
@IBOutlet var firstNameField: RoundedTextfield!
@IBOutlet var lastNameField: RoundedTextfield!
@IBOutlet var emailField: RoundedTextfield!
@IBOutlet var passwordField: RoundedTextfield!
@IBOutlet var confirmPasswordField: RoundedTextfield!
@IBOutlet var registerButton: ActionButton!
override func awakeFromNib() {
super.awakeFromNib()
blurView.layer.addShadow()
blurView.layer.roundCorners(radius: 10)
setupViews()
}
func setupViews() {
firstNameField.label.text = "first name".uppercased()
lastNameField.label.text = "last name".uppercased()
emailField.label.text = "email".uppercased()
passwordField.label.text = "password".uppercased()
confirmPasswordField.label.text = "confirm password".uppercased()
}
class func instanceFromNib() -> RegisterView {
return UINib(nibName: "RegisterView", bundle: nil).instantiate(withOwner: self, options: nil)[0] as! RegisterView
}
}
RoundedTextfield
import UIKit
@IBDesignable
class RoundedTextfield: UIView {
@IBOutlet var label: UILabel!
@IBOutlet var textField: UITextField!
@IBOutlet var textFieldCenterY: NSLayoutConstraint!
@IBInspectable var cornerRadius: CGFloat = 4 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = cornerRadius > 0
}
}
@IBInspectable var borderWidth: CGFloat = 0 {
didSet {
layer.borderWidth = borderWidth
}
}
@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.cgColor
}
}
override func awakeFromNib() {
super.awakeFromNib()
print("Textfield awoken")
print(label == nil && textField == nil ? "outlets are not set" : " outlets set")
}
}