代码之家  ›  专栏  ›  技术社区  ›  vinbhai4u

私有变量值位于ios swift的CustomView中

  •  0
  • vinbhai4u  · 技术社区  · 6 年前

    我正在尝试使用下面的代码创建一个customView

    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时,会调用\u isSelecteda的私有声明并重置值。我的目标是设置从ViewController中选择的isSelected的值并更改其背景色。

    据我了解,情况不应该是这样。很奇怪

    注意:我使用的是Xcode 9.4.1和Swift 4.1

    2 回复  |  直到 6 年前
        1
  •  1
  •   Rakesha Shastri    6 年前

    为什么不用 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
        }
    }
    

    复位 可能是因为变量仍然具有 oldValue 在setter中用于比较的。当调用setter中的变量时,getter得到 因为 newValue 尚未设置。


    注:最好按照官方命名的命名惯例 guidelines . CustomView -&燃气轮机; customView .

        2
  •  1
  •   Rishabh    6 年前

    根据我的理解,你应该这样改变设置者:

    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
        }
    }
    

    新价值

    当你这么做的时候:

    customView.isSelecteda = false
    

    您可以在这个问题中找到有关“oldValue”和“newValue”的更多信息: Click Here

    编辑:这是正确行为的理由:

    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
        }
    }