self.tableView.indexPathForCell(cell)返回错误的单元格?

时间:2016-01-16 13:56:45

标签: ios uitableview swift2 uistoryboard

我有一个带有自定义动态单元格的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. 我为单元格1设置了UIStepper.value 3 - 第1部分。
  2. 我向下滚动到表格视图的底部,以便单元格1 - 第1部分远离视图。
  3. 我为单元格1设置了UIStepper.value 5 - 第4节。
  4. 我向上滚动到顶部,以便单元格1 - 第1部分重新进入视图。
  5. 我将UIStepper增加1.所以数量应该是4.相反,它是6。
  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 个答案:

答案 0 :(得分:0)

您需要更新elsecellForRowAtIndexPath子句中的步进器值:

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

否则步进器将保留上次使用单元格时的值。