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        
}

Вышеуказанная настройка работает хорошо, в большинстве случаев. Я не могу понять, как решить следующую проблему. Вот пример для иллюстрации:

  1. Я установил UIStepper.value 3 для ячейки 1 - раздел 1.
  2. Я прокручиваю вниз до нижней части табличного представления, чтобы ячейка 1 - секция 1 была полностью вне поля зрения.
  3. Я установил UIStepper.value 5 для ячейки 1 - раздел 4.
  4. Я прокручиваю обратно вверх, чтобы ячейка 1 - секция 1 снова была в поле зрения.
  5. Я увеличиваю 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)
}

В противном случае степпер сохраняет значение предыдущего раза, когда использовалась ячейка.

Другие вопросы по тегам