2

我正在努力弄清楚如何使用模型对象的 didSet 正确设置布尔值。我的应用程序有一系列可滑动的卡片,有些可以翻转,有些则不能。下面的代码是为创建的每张卡片运行的 CardView。

目前,该代码非常适用于图像和标签——每张卡片根据每张卡片的模型对象加载唯一信息。但是, button 和 isFlippable 属性是我苦苦挣扎的地方。

现在的代码总是加载绿色路径。然而,奇怪的是,即使 cardModel 应该将按钮 isEnabled 设置为 false,它仍然会加载绿色(但按钮不起作用,所以它确实被禁用了......)

var cardModel: CardModel! {
   didSet {
      imageView.image = cardModel.image
      label.text = cardModel.label
      flipButton.isEnabled = cardModel.isFlippable
      isBackShowing = cardModel.isFlippable //Intentionally use isFlippable here because I want the initial layout to be based on this true or false value.
   }
}


let imageView = UIImageView()
let label = UILabel()
let flipButton = UIButton()
var isBackShowing = false

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

fileprivate func setupLayout() {

    if flipButton.isEnabled == true {
        if isBackShowing == true {
            backgroundColor = .red
        } else {
            backgroundColor = .green
        }
    } else {
        backgroundColor = .yellow
    }
}

我也有当按钮翻转时交替“isBackShowing”然后调用 setupLayout() 的代码——它工作正常。但它在卡的初始设置期间总是加载为假。

4

1 回答 1

1

为了更好的可读性,您可以稍微更新您的代码,替换var isBackShowing = Bool()var isBackShowing = false.

setupLayout()您也可以在设置 cardModel 后调用以更新您的布局。例如can 看起来像这样didSetcardModel

var cardModel: CardModel! {
   didSet {
      imageView.image = cardModel.image
      label.text = cardModel.label
      flipButton.isEnabled = cardModel.isFlippable
      isBackShowing = cardModel.isFlippable
      setupLayout()
   }
}
于 2019-03-20T17:32:20.840 回答