防止选定的单元格被重用

时间:2017-07-25 12:58:14

标签: ios swift uitableview

所以我有一个tableview,其中包含每个单元格中的项目列表。这些单元格中的每一个都包含一个图像视图,在被点击时,它会展开单元格并显示该项目的图像。当我向下滚动表格视图并向上滚动到所选的单元格时,图像消失了。我知道这是由于重复使用单元格,但我不确定如何在滚动浏览其他项目时保持扩展的单元格图像。

我最接近的是: my table view reuse the selected cells when scroll -- in SWIFT

如果有人能借给我一手会很棒的话。谢谢!

编辑:添加代码段 - 抱歉等待。

fileprivate var expandedRowIndex: Int?

// cellForRowAt
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    // CatalogItem row.
    let item = self.items[indexPath.row]
    let expanded = indexPath.row == self.expandedItemRowIndex

    // Return standard catalog item cell.
    let reuseID = expanded
                ? CatalogItemCell.PROTOCELL_EXPANDED.id
                : CatalogItemCell.PROTOCELL.id
    let cell = tableView.dequeueReusableCell(withIdentifier: reuseID) as! CatalogItemCell

    // Reset thumbnail image back to nil. Needed so that images appear
    // only in the cell that they belong in.
    if indexPath.row == self.expandedRowIndex{
        cell.uiImage_Thumbnail.image = nil
    }       
    return cell
}

// didSelectRowAt
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
    tableView.deselectRow(at: indexPath as IndexPath, animated: true)

    // Expand row - Get the current cell and show image
    self.expandedItemRowIndex = indexPath.row
    let item = self.items[indexPath.row]
    let currentCell = tableView.cellForRow(at: indexPath)

    // Pass both the selected cell and item to the ImageManager
    ImageManager.startImageRequest(currentCell: currentCell!, item: item)

    if self.expandedRowIndex == indexPath.row
    {
       // Selected row is already expanded.
       return
    }

    var reloadPaths = [IndexPath]()

    // Collapse previously expanded row.
    if let previousRowIndex = self.expandedRowIndex
    {
        reloadPaths.append(IndexPath(row: previousRowIndex, section: 0))
    }

    // Expand the selected row.
    self.expandedRowIndex = indexPath.row
    let item = self.items[indexPath.row]
    debugPrint(item.description)
    reloadPaths.append(IndexPath(row: indexPath.row, section: 0))
    tableView.reloadRows(at: reloadPaths as [IndexPath], with: .fade)

}

1 个答案:

答案 0 :(得分:3)

您可以维护selectedIndex变量。 在您的cellForRow中,您可以检查此调用是否适用于selectedCell。如果是,则执行所选单元格所需的自定义。

此外,您可能还想处理heightForRow,还会检查该调用是否适用于所选单元格。

您可以维护所选单元格的indexPath。如果有多个部分。 无需阻止它重复使用。

希望有所帮助。