http://en.wikipedia.org/wiki/Virtual_function
«В объектно-ориентированном программировании виртуальная функция или виртуальный метод - это функция или метод, поведение которых может быть переопределено внутри наследующего класса функцией с той же сигнатурой ».
Google всегда является вашим другом.
Я нашел что-то не так в вашем коде.
У вас есть розетка для contentView
. Это означает, что это представление уже добавлено в вашу иерархию представлений. Тогда в вашем commonInit()
addSubview (contentView) 'делать неправильно.
Результат Bundle.main.loadNibNamed("VerificationCodeView", owner: self, options: nil)
не используется.
Вы можете использовать это для загрузки представления из пера:
let verificationCodeView = UINib(nibName: "VerificationCodeView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! VerificationCodeView
Если вы хотите получить экземпляр VerificationCodeView
, напишите метод класса, как показано ниже.
class func instantiateFromNib() -> VerificationCodeView {
let verificationCodeView = UINib(nibName: String(describing:self), bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! VerificationCodeView
return verificationCodeView
}
Теперь, когда вам нужно это представление, просто получите его, как показано ниже:
let verificationCodeView = VerificationCodeView.instantiateFromNib()
Пожалуйста, обновите вашу функцию
private func commonInit() {
let uvNub: UIView = Bundle.main.loadNibNamed("VerificationCodeView", owner: self, options: nil) //CRASHES HERE
self.addSubview(uvNub)
contentView.frame = self.bounds
contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
}
Попробуйте приведенный ниже код,
fileprivate func commonInit () {
let bundle = Bundle(for: type(of: self))
bundle.loadNibNamed("VerificationCodeView", owner: self, options: nil)
self.addSubview(containerView)
containerView.translatesAutoresizingMaskIntoConstraints = false
containerView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 0).isActive = true
containerView.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: 0).isActive = true
containerView.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
containerView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0).isActive = true
}