Подкласс Swift UIButton и изменение цвета в зависимости от переменной

Я использую подкласс для своего UIButton, и у него есть переменная с именем isActive. Мне нужно изменить цвет границы кнопки на основе этой переменной. Эта переменная изменится программно. Пожалуйста, помогите мне с этим.

@IBDesignable
class buttonCTAOutlineDark: UIButton {

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

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

override func prepareForInterfaceBuilder() {
    commonInit()
}

@IBInspectable var isActive: Bool {
    get {
        return self.isActive
    }
    set (active) {
        if active {
            commonInit(isActive: active)
        }
    }
}

func commonInit(isActive: Bool = false) {
    self.backgroundColor = .clear
    self.layer.cornerRadius = 4
    self.layer.borderWidth = 1

    if (isActive) {
        self.tintColor = ACTIVE_COLOR
        self.layer.borderColor = ACTIVE_COLOR.cgColor
    } else {
        self.tintColor = nil
        self.layer.borderColor = UIColor(red:0.69, green:0.72, blue:0.77, alpha:1.0).cgColor
    }
}
}

person hashB    schedule 29.11.2018    source источник
comment
Используйте обозреватель свойств didSet, willSet. всякий раз, когда вы будете обновлять значение свойств, этот метод будет вызывать. взгляните на это nshipster.com/swift-property-observers   -  person Kazi Abdullah Al Mamun    schedule 29.11.2018
comment
@hashHb get {return self.isActive} будет вызываться рекурсивно. Поэтому вместо этого попробуйте {return isActive}. Также в set (active) метод commonInit будет вызываться только тогда, когда active истинно. так что можешь попробовать set (active) { isActive = active;commonInit(isActive: active)}   -  person Natarajan    schedule 29.11.2018
comment
Лично я бы вообще не рекомендовал использовать эти наблюдатели свойств, так как вызывающему не ясно, какие побочные эффекты могут иметь изменения свойств. Я бы просто создал для него метод, чтобы вызывающему было более ясно, что все может измениться.   -  person J. Doe    schedule 29.11.2018


Ответы (2)


Ваше свойство isActive написано неправильно. Прежде всего, это не должно быть вычисляемым свойством. В настоящее время геттер просто вызывает бесконечную рекурсию, а сеттер фактически ничего не устанавливает.

Свойство isActive должно быть сохраненным свойством с наблюдателем свойства didSet:

@IBInspectable
var isActive: Bool {
    didSet {

    }
}

Внутри didSet вы можете просто поместить последнюю часть commonInit. Первую часть commonInit не нужно запускать каждый раз при изменении isActive. Я рекомендую вам извлечь это как метод с именем updateBorder:

func updateBorder(isActive: Bool) {

    if (isActive) {
        self.tintColor = ACTIVE_COLOR
        self.layer.borderColor = ACTIVE_COLOR.cgColor
    } else {
        self.tintColor = nil
        self.layer.borderColor = UIColor(red:0.69, green:0.72, blue:0.77, alpha:1.0).cgColor
    }

}

И затем в didSet вы можете просто вызвать это:

updateBorder(isActive: isActive)
person Sweeper    schedule 29.11.2018

Вы должны следить за didSet, чтобы обновить файл view. В Swift имена типов должны начинаться с прописных букв, например ButtonCTAOutlineDark. Пожалуйста, смотрите фиксированный класс,

@IBDesignable
class ButtonCTAOutlineDark: UIButton {

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

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

    @IBInspectable var isActive: Bool = false {
        didSet {
            self.commonInit(isActive: self.isActive)
        }
    }

    func commonInit(isActive: Bool = false) {
        self.backgroundColor = .clear
        self.layer.cornerRadius = 4
        self.layer.borderWidth = 1

        if (isActive) {
            self.tintColor = ACTIVE_COLOR
            self.layer.borderColor = ACTIVE_COLOR.cgColor
        } else {
            self.tintColor = nil
            self.layer.borderColor = UIColor(red:0.69, green:0.72, blue:0.77, alpha:1.0).cgColor
        }
    }
}
person Kamran    schedule 29.11.2018
comment
Спасибо @Kamran. Это помогло. - person hashB; 29.11.2018