Странная проблема с 2 инициализаторами в Swift - PullRequest
0 голосов
/ 27 апреля 2018

Я хочу создать 2 инициализатора для своего пользовательского класса кнопок, который выглядит следующим образом:

protocol CustomButtonProtocol {
    var title: String { get set }
    var cornerRadius: CGFloat { get set }
    var backgroundColor: UIColor { get set }
}

struct Button: CustomButtonProtocol {
    var title: String
    var cornerRadius: CGFloat
    var backgroundColor: UIColor
}

class CustomButton: UIButton {
var title: String? {
    didSet {
        self.setTitle(title, for: .normal)
    }
}

var cornerRadius: CGFloat = 0.0 {
    didSet {
        self.layer.cornerRadius = cornerRadius
    }
}

var color: UIColor? {
    didSet {
        self.backgroundColor = color
    }
}

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

init(with frame: CGRect, button: Button) {
    super.init(frame: frame)

    self.title = button.title
    self.cornerRadius = button.cornerRadius
    self.backgroundColor = button.backgroundColor
}

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

Я хочу иметь 2 инициализатора, первый - простой init, второй - с моим Button, но проблема в том, что он изменяет ТОЛЬКО фоновый цвет, но не имеет свойств title и cornerRadius и Я не могу найти, почему это происходит. Может я чего-то не вижу, не могли бы вы помочь мне с поиском ошибки?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Вы использовали didSet для обновления значения свойства кнопки.

Он не будет вызывать didSet при установке значения внутри init.

устанавливается цвет фона, потому что вы установили backgroundColor по ошибке вместо color

self.backgroundColor = button.backgroundColor

Вы должны использовать / звонить ниже внутри / снаружи init один раз.

self.setTitle(title, for: .normal)
self.layer.cornerRadius = cornerRadius
self.backgroundColor = color
0 голосов
/ 27 апреля 2018

Учтите, что наблюдатели свойства willSet / didSet не вызываются в init методах

Из документации :

Когда вы присваиваете значение по умолчанию хранимому свойству или устанавливаете его начальное значение в инициализаторе, значение этого свойства устанавливается напрямую, без вызова каких-либо наблюдателей свойства.

Решение состоит в том, чтобы вызывать код в наблюдателях также в методе init

init(with frame: CGRect, button: Button) {
    super.init(frame: frame)

    self.title = button.title
    self.setTitle(self.title, for: .normal)
    self.cornerRadius = button.cornerRadius
    self.layer.cornerRadius = self.cornerRadius
    self.color = button.backgroundColor
    self.backgroundColor = self.color
}

Если color всегда представляет цвет фона, свойство фактически избыточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...