Значение приватных переменных покоится в CustomView в ios swift - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь создать customView, используя xib, ниже приведен код

import UIKit

class CustomView: UIView {

@IBOutlet var CustomView: UIView!

private var _isSelecteda:Bool!
var isSelecteda: Bool {
    get {
        return _isSelecteda
    }
    set {
        _isSelecteda = isSelecteda
        if _isSelecteda {
            CustomView.backgroundColor = UIColor.white
            CustomView.layer.borderColor = UIColor.black.cgColor
        }
        else {
            CustomView.backgroundColor = Colors.searchGameCellBackgroundColor
            CustomView.layer.borderColor = Colors.priceLabelBorderColor?.cgColor
        }
    }
}



override init(frame: CGRect) {

    super.init(frame: frame) 
    commonInit()

}

required init?(coder aDecoder: NSCoder) {

    super.init(coder: aDecoder)
    commonInit()

}


private func commonInit() {
    Bundle.main.loadNibNamed("CustomView", owner: self, options: nil)
    addSubview(CustomView)
    self._isSelecteda = false
    CustomView.layer.cornerRadius = 3
    CustomView.layer.borderWidth = 1
    self.clipsToBounds = true
    CustomView.frame = self.bounds

}

@IBAction func btnSelectedTapped(_ sender: Any) {
    isSelecteda = !isSelecteda
}
}

Когда я пытаюсь получить доступ к isSelecteda, вызывается закрытое объявление _isSelecteda, которое сбрасывает значение. Моя цель - установить значение isSelected из ViewController и изменить его цвет фона.

Насколько я понимаю, этого не должно быть. Это очень странно

Примечание: я использую Xcode 9.4.1 с Swift 4.1

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Насколько я понимаю, вы должны изменить сеттер следующим образом:

set {
    _isSelecteda = newValue
    if _isSelecteda {
        CustomView.backgroundColor = UIColor.white
        CustomView.layer.borderColor = UIColor.black.cgColor
    }
    else {
        CustomView.backgroundColor = Colors.searchGameCellBackgroundColor
        CustomView.layer.borderColor = Colors.priceLabelBorderColor?.cgColor
    }
}

Переменная newValue является фактическим значением, которое принимается при вызове установщика.

Когда вы сделаете это:

customView.isSelecteda = false

Сеттер получает значение false в переменной newValue. Вы устанавливаете это значение на свою личную переменную и выполняете последующие функции на основе этого значения.

Вы можете найти больше о 'oldValue' и 'newValue' в этом вопросе: Нажмите здесь

РЕДАКТИРОВАТЬ: обоснование того, как это правильное поведение:

get {
    return _isSelecteda                      // false - from init call
}
set {
    _isSelecteda = isSelecteda               // isSelecteda getter called from above returning false, newValue is neglected
    if _isSelecteda {                        // returns false
        CustomView.backgroundColor = UIColor.white
        CustomView.layer.borderColor = UIColor.black.cgColor
    }
    else {
        CustomView.backgroundColor = Colors.searchGameCellBackgroundColor
        CustomView.layer.borderColor = Colors.priceLabelBorderColor?.cgColor
    }
}
0 голосов
/ 05 сентября 2018

Почему бы не использовать didSet для этого?

didSet {
    if isSelecteda {
        CustomView.backgroundColor = UIColor.white
        CustomView.layer.borderColor = UIColor.black.cgColor
    } else {
        CustomView.backgroundColor = Colors.searchGameCellBackgroundColor
        CustomView.layer.borderColor = Colors.priceLabelBorderColor?.cgColor
    }
}

Причина, по которой ваше значение равно reset , возможно, потому, что ваша переменная все еще имеет oldValue, который вы используете для сравнения внутри установщика. Когда вы вызываете переменную внутри установщика, получатель получает oldValue, потому что newValue еще не был установлен.


Примечание. Желательно следовать соглашениям о присвоении имен в соответствии с официальными правилами именования . Переменные нижний регистр верблюда . CustomView -> customView.

...