self.tableView.indexPathForCell(cell) возвращает неправильную ячейку?
У меня есть UITableView (несколько разделов) с настраиваемыми динамическими ячейками. В каждой ячейке есть UIStepper, представляющий выбранное количество.
Чтобы отправить выбранное количество (UIStepper.value) из ячейки обратно в мой UITableViewController
Я реализовал следующий протокол:
protocol UITableViewCellUpdateDelegate {
func cellDidChangeValue(cell: MenuItemTableViewCell)
}
И это IBAction в моей пользовательской ячейке, где подключен UIStepper:
@IBAction func PressStepper(sender: UIStepper) {
quantity = Int(cellQuantityStepper.value)
cellQuantity.text = "\(quantity)"
self.delegate?.cellDidChangeValue(self)
}
И изнутри мой UITableViewController
Я фиксирую это через:
func cellDidChangeValue(cell: MenuItemTableViewCell) {
guard let indexPath = self.tableView.indexPathForCell(cell) else {
return
}
// Update data source - we have cell and its indexPath
let itemsPerSection = items.filter({ $0.category == self.categories[indexPath.section] })
let item = itemsPerSection[indexPath.row]
// get quantity from cell
item.quantity = cell.quantity
}
Вышеуказанная настройка работает хорошо, в большинстве случаев. Я не могу понять, как решить следующую проблему. Вот пример для иллюстрации:
- Я установил
UIStepper.value
3 для ячейки 1 - раздел 1. - Я прокручиваю вниз до нижней части табличного представления, чтобы ячейка 1 - секция 1 была полностью вне поля зрения.
- Я установил
UIStepper.value
5 для ячейки 1 - раздел 4. - Я прокручиваю обратно вверх, чтобы ячейка 1 - секция 1 снова была в поле зрения.
- Я увеличиваю UIStepper на 1. Так что количество должно было быть 4. Вместо этого это 6.
Отладка всего этого показывает, что эта строка (в реализации делегата UITableViewController
) получает неправильное количество. Похоже на то indexPathForCell
получает неправильную ячейку и возвращает неправильное количество?
// cell.quantity is wrong
item.quantity = cell.quantity
Для полноты картины, вот реализация cellForRowAtIndexPath, где ячейки снимаются с очереди по мере их появления:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cellIdentifier = "MenuItemTableViewCell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! MenuItemTableViewCell
cell.delegate = self
// Match category (section) with items from data source
let itemsPerSection = items.filter({ $0.category == self.categories[indexPath.section] })
let item = itemsPerSection[indexPath.row]
// cell data
cell.cellTitle.text = item.name + " " + formatter.stringFromNumber(item.price)!
cell.cellDescription.text = item.description
cell.cellPrice.text = String(item.price)
if item.setZeroQuantity == true {
item.quantity = 0
cell.cellQuantityStepper.value = 0
cell.cellQuantity.text = String(item.quantity)
// reset for next time
item.setZeroQuantity = false
}
else {
cell.cellQuantity.text = String(item.quantity)
}
.....
....
..
.
}
1 ответ
Вам необходимо обновить значение степпера в else
пункт в cellForRowAtIndexPath
:
else {
cell.cellQuantity.text = String(item.quantity)
cell.cellQuantityStepper.value = Double(item.quantity)
}
В противном случае степпер сохраняет значение предыдущего раза, когда использовалась ячейка.