Подкласс UIView - PullRequest
       7

Подкласс UIView

0 голосов
/ 23 октября 2018

Я пытаюсь создать подкласс UIView с помощью пользовательского инициализатора, но сталкиваюсь с несколькими ошибками.

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: «self» используется в доступе к свойству title перед вызовом self.init

Однако Swift требует, чтобы все инициализаторы в суперклассе вызывались после инициализации других переменных экземпляра.Так что ошибка должна лежать где-то еще.

Высоко ценю чаевые здесь.

1 Ответ

0 голосов
/ 23 октября 2018

Подумайте, что вы ожидаете от…

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

и

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

У вас есть необязательная переменная экземпляра title.Как получить значение в этих 2 случаях?

А в ваших 3 init

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

init(title: String) звонит init(title: String), что, в свою очередь, вызывает 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)
}

, а затем присвойте значение title впоследствии

...