重新加载数据时,带有透明单元格的UITableView会重叠旧单元格

时间:2015-08-23 13:55:17

标签: ios iphone swift uitableview uisearchbar

我有一个透明背景颜色的UITableView和具有透明背景颜色的单元格。当我用:

重新加载我的tableView时
dataSource = some new data
tableView.reloadData()

我可以看到新细胞与旧细胞重叠。 transparent cells overlapping each other

我确实尝试过使用

tableView.beginUpdates()
// remove all rows here
change data source
// insert new rows here
tableView.endUpdates()

但它不起作用。我也试过tableView.reloadRowsAtIndexPath(...),但仍然没有运气。

最后,我重新绘制了所有单元格和表格视图以清除图形上下文,但它无法解决此问题。

非常感谢任何帮助。

我的细胞创建功能:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("suggestioncell")
    cell.backgroundColor = UIColor.whiteColor().alpha(0.1)
    cell.textLabel?.text = (suggestions![indexPath.row] as! SVPlacemark).formattedAddress
    cell.clearsContextBeforeDrawing = true
    cell.contentView.clearsContextBeforeDrawing = true
    return cell
}

2 个答案:

答案 0 :(得分:0)

尝试覆盖prepareForReuse子类中的UITableViewCell,然后重置内容。

以下是文档中关于此的内容:

  

准备可重用的单元格以供表格视图的委托重用。

     

如果UITableViewCell对象是可重用的 - 也就是说,它具有重用标识符 - 在从UITableView方法dequeueReusableCellWithIdentifier:返回对象之前调用此方法:出于性能原因,您应该仅重置与内容无关的单元格属性,例如,alpha,编辑和选择状态。 tableView:cellForRowAtIndexPath:中的表视图委托应始终在重用单元格时重置所有内容。如果单元对象没有关联的重用标识符,则不会调用此方法。如果重写此方法,则必须确保调用超类实现。

答案 1 :(得分:0)

自定义UITableViewCell类:

class customCell: UITableViewCell {
    override func prepareForReuse() {
        self.textLabel?.text = nil
    }
}

在你的cellForRowAtIndexPath方法中:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("suggestionCell", forIndexPath: indexPath) as! customCell
    cell.backgroundColor = UIColor.whiteColor().alpha(0.1)
    cell.textLabel?.text = (suggestions![indexPath.row] as! SVPlacemark).formattedAddress
    return cell
}

当然,在您的XIB / Storyboard中,将单元类设置为CustomCell,并设置其重用标识符。