0

我有一个自定义UITableViewCell的数据模型数组,UILabel如下所示:

class ItemCustomizationCollectionViewCell: UITableViewCell {

    var customizationData: CustomizationData?

    let priceLabel: UILabel = {
        let label = UILabel()
        label.font = UIFont.boldSystemFont(ofSize: 18)
        label.textAlignment = .left
        label.textColor = UIColor.gray
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }() 

    //other init and constraints
}

现在,CustomizationData 看起来像这样:

class CustomizationData {
    let title: String
    var customizationOptions: [PickerOption]
    var choosenOption: PickerOption?

    init(title: String, customizationOptions: [PickerOption], choosenOption: PickerOption?) {
        self.title = title
        self.customizationOptions = customizationOptions
        self.choosenOption = choosenOption
    }
}

PickerOption 是:

class PickerOption {
    let title: String
    let price: String

    init(title: String, price: String) {
        self.title = title
        self.price = price
    }
}

我的问题是:

我想听一下customizationData 的choosenOption 的设置,并获取标题以将UILabel' 的文本更改为choosenOption 的价格。

我尝试将 didSet 添加到自定义数据中,但由于其属性之一正在更改,因此未调用它。不是自定义数据本身。

4

2 回答 2

1

您可以做的事情是可能的,但是要触发 didSet customizationOptions,您需要更改其值,基本上有两种方式:

  • 如果customizationOptions是引用类型,则需要将其更改为另一个引用
  • 如果customizationOptions是诸如 anArray之类的值类型,如果您更改其中的值,也应该调用 didSet,因为数组完全改变了结构。

为了更好地理解这里是一个例子。
使用值类型:

class Mine {
    var list: [String] = ["Hello"] {
        didSet {
            print("Array changed \(list)")
        }
    }
}

var mine = Mine()

mine.list.append("World") //Array changed ["Hello", "World"]

使用引用类型:

class Mine {
    var list: NSArray = ["Hello"] {
        didSet {
            print("Array changed \(list)")
        }
    }
}

var mine = Mine()
mine.list.adding("World")
 //Doesn't print nothing
mine.list = ["World"]
//print World
于 2017-09-25T12:23:59.697 回答
0

我认为你可以使用委托来做到这一点。创建一个 CustomizationDataDelegate 协议:

protocol CustomizationDataDelegate {
    func choosenOptionDidChange(to newValue: PickerOption)
}

然后在 CustomizationData 类中创建一个委托属性,例如:

internal var delegate : CustomizationDataDelegate?

并添加一个 didSet 到 choosenOption:

var choosenOption : PickerOption? {
    didSet{
           if let _ = choosenOption {
              delegate?.choosenOptionDidChange(to choosenOption!)
         }
    }
}

然后将 ItemCustomizationCollectionViewCell 注册到 CustomizationDataDelegate 协议,然后当您有一些自定义数据时,确保将委托设置为单元格的值:

class ItemCustomizationCollectionViewCell: UITableViewCell, CustomizationDataDelegate {

    var customizationData: CustomizationData? {
        didSet {

            if let _ = customizationData {
                if let _ = customizationData!.choosenOption {
                    // You need this in case the choosenOption has already been set
                    choosenOptionDidChange(to: customizationData!.choosenOption)
                }

                // You need this to listen for future changes
                customizationData!.delegate = self
            }
        }
    }

    let priceLabel: UILabel = {
    // ...

    // In your class' function declarations...

    //# MARK:- CustomizationDataDelegate methods 

    func choosenOptionDidChange(to newValue: PickerOption) -> Void {
        // Update the label's value here based on newValue
    }
}

希望有帮助。

于 2017-09-25T12:31:50.327 回答