Создать компонент с UILabel и UITextdfield - PullRequest
0 голосов
/ 29 ноября 2018

Я новичок в Swift, пришедший из веб-разработчика, поэтому я довольно привык к компонентам.Я пытаюсь создать форму и хотел бы повторно использовать текстовое поле и метку в других представлениях.Я создал новый класс, который наследуется от UIView, и хочу переопределить init для создания набора новых свойств.

Пока мой код

final class TextFormField: UIView {
    var labelText: String
    var secureText: Bool
    var keyboardType: UIKeyboardType

    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    init(labelText: String, secureText: Bool, keyboardType: UIKeyboardType){
        self.labelText = labelText
        self.secureText = secureText
        self.keyboardType = keyboardType
        super.init()
    }
    convenience init() {
        self.init()
    }

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

Ошибка, которую я получаю сейчас, равна Must call a designated initializer of the superclass 'UIView' во втором init.

Как я могу переопределить init, чтобы получить еще 3 параметра?Нужно ли вместо этого делать расширение?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

В вашем коде есть две проблемы, препятствующие его компиляции:

Отсутствуют инициализаторы

override init(frame: CGRect) не инициализирует объявленные вами переменные (labelText, secureText, keyboardType).
Для решения этой проблемы у вас есть следующие опции:

  1. добавить значения по умолчанию:

    var labelText: String = ""
    
  2. сделайте переменные неявно развернутыми - обратите внимание, что переменные могут быть нулевыми, если они не инициализированы перед использованием

    var labelText: String!
    
  3. , пропустите метод override init(frame: CGRect), поскольку вы его не используете.Это также позволит вам сохранить текущие объявления переменных.

Неправильный вызов инициализатора

В init(labelText: String, secureText: Bool, keyboardType: UIKeyboardType) вам необходимо вызвать суперинициализатор.
Для этого замените:

super.init()

на:

super.init(frame: .zero)
0 голосов
/ 29 ноября 2018

Вы должны избавиться от всех ненужных инициализаторов и убедиться, что ваш пользовательский метод init вызывает один из назначенных инициализаторов super.

final class TextFormField: UIView {
    var labelText: String
    var secureText: Bool
    var keyboardType: UIKeyboardType

    init(labelText: String, secureText: Bool, keyboardType: UIKeyboardType){
        self.labelText = labelText
        self.secureText = secureText
        self.keyboardType = keyboardType
        super.init(frame: .zero)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...