如何使用 UIStepper 更改领域模型对象中的 属性?

How do I use UIStepper to change a property in a Realm Model Object?

我目前有一个 ViewController,里面有一个 TableView,叫做 SelectedListItemsViewController。此 ViewControllerTableView 由名为 SelectedListItemsTableViewCell 的自定义单元格 class 填充。

我有一个名为 selectedListItems 的领域模型对象数组,每个对象都有几个属性。 SelectedListItemsTableViewCellindexPath.row 对象的 listItem 属性 填充 TableView,并且每一行都有一个 UIStepper 和一个 UILabel 旁边(截至目前)每行显示 UIStepper.value。理想情况下,标签将反映每一行的 listItemWeight 属性,并在增加或减少该行时更改它。

这是我的自定义单元格:

class SelectedListItemsTableViewCell: UITableViewCell {

    @IBOutlet var selectedListItemLabel: UILabel!
    @IBOutlet weak var listItemWeightLabel: UILabel!
    @IBOutlet weak var stepperControl: UIStepper!

    @IBAction func stepperValueChanged(sender: UIStepper) {

        listItemWeightLabel.text = Int(sender.value).description

    }
}

并且在我的 ViewControllercellForRowAtIndexPath 中,我已经像这样配置了单元格:

    // Configure the cell...
    cell.selectedListItemLabel.text = selectedListItems[indexPath.row].listItem

    cell.listItemWeightLabel.text = "\(selectedListItems[indexPath.row].listItemWeight)"

完美加载 listItem 属性,并且 listItemWeight 属性 正确显示,但是一旦我在 [=24= 上递增或递减] 搞砸了。

如何正确 link 我的 UILabel 和 UIStepper 到 [indexPath.row].listItemWeight

在步进器更新时调用的相同方法中,更新您的 listItem。但是,由于此项存储在您的 Realm 数据库中,您将必须获取 Realm 数据库的实例并将更改写入数据库。

您可以通过让 TableViewCell 保留 listItem 的一个实例来做到这一点。您的新 TableViewCell class 将如下所示:

class SelectedListItemsTableViewCell: UITableViewCell {

    @IBOutlet var selectedListItemLabel: UILabel!
    @IBOutlet weak var listItemWeightLabel: UILabel!
    @IBOutlet weak var stepperControl: UIStepper!

    var listItem: Item?

    @IBAction func stepperValueChanged(sender: UIStepper) {
        listItemWeightLabel.text = Int(sender.value).description
        if let listItem = listItem {
            let realm = try! Realm
            try! realm.write {
                listItem.listItemWeight = Int(sender.value) ?? 0
            }
        }
    }
}

以上答案有助于引导我找到问题的实际解决方案,但如果以后有人好奇 - 我最终使用了闭包。

在我的自定义单元格 class 中,我做了

@IBAction func stepperValueChanged(sender: UIStepper) {

    selectedListItemLabel.text = Int(sender.value).description
    tapped?(self)

}

在我的视图控制器中,我做到了

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! SelectedListItemsTableViewCell

    cell.stepperControl.value = selectedListItems[indexPath.row].listItemWeight

    // Configure the cell...

    cell.tapped = { (selectedCell) -> Void in

        selectedListItems[indexPath.row].listItemWeight = cell.stepperControl.value

    }

这让我可以访问视图控制器文件中每个单元格的 UIStepper

阅读 中 flashadvanced 的选项 2 答案很有帮助。