如何使用 UIStepper 更改领域模型对象中的 属性?
How do I use UIStepper to change a property in a Realm Model Object?
我目前有一个 ViewController
,里面有一个 TableView
,叫做 SelectedListItemsViewController
。此 ViewController
的 TableView
由名为 SelectedListItemsTableViewCell
的自定义单元格 class 填充。
我有一个名为 selectedListItems
的领域模型对象数组,每个对象都有几个属性。 SelectedListItemsTableViewCell
用 indexPath.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
}
}
并且在我的 ViewController
的 cellForRowAtIndexPath
中,我已经像这样配置了单元格:
// 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 答案很有帮助。
我目前有一个 ViewController
,里面有一个 TableView
,叫做 SelectedListItemsViewController
。此 ViewController
的 TableView
由名为 SelectedListItemsTableViewCell
的自定义单元格 class 填充。
我有一个名为 selectedListItems
的领域模型对象数组,每个对象都有几个属性。 SelectedListItemsTableViewCell
用 indexPath.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
}
}
并且在我的 ViewController
的 cellForRowAtIndexPath
中,我已经像这样配置了单元格:
// 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
。
阅读