2016-01-16 1 views
2

У меня есть UITableView (несколько разделов) с пользовательскими динамическими ячейками. Каждая ячейка имеет UIStepper, представляющий выбранное количество.self.tableView.indexPathForCell (cell) возвращает неправильную ячейку?

Для того, чтобы отправить выбранное количество (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.

Debugging всего это показывает, что эта линия (в реализации делегата от 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) 
    } 
    ..... 
    .... 
    .. 
    . 
} 

ответ

0

Вам необходимо обновить значение шагового в предложении else в cellForRowAtIndexPath:

else { 
    cell.cellQuantity.text = String(item.quantity) 
    cell.cellQuantityStepper.value = Double(item.quantity) 
} 

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

 Смежные вопросы

  • Нет связанных вопросов^_^