如何删除可在UITableView(MonoTouch)中重用的单元格

时间:2011-11-07 03:05:16

标签: cocoa-touch ipad uitableview xamarin.ios

我们有一个场景,我们重复使用相同的UITableView来显示数据库中的不同记录集,因为用户在不同的UITableView中选择一个项目(概念类似于splitviewcontroller,但都在同一个视图中)。 p>

当用户选择要查看的其他区域时,我们从数据库中获取相应的记录,使用新的记录集更新Source,并调用ReloadData。

问题是UITableView中的某些单元格仍然存在,并且在列表之间切换时会被重用,从而导致各行的数据无效或重叠。

我的问题是:有没有一种方法可以告诉UITableView丢弃所有现有的单元格,包括那些排队等待重用的单元格?我原本期望ReloadData能够执行这项任务,但事实并非如此。

更新并进一步澄清:

我们表格中的每个单元格都由可变数量的子视图组成(我们试图模仿网格控件)。当用户在左侧导航中选择不同的列表时,不能保证新选择的列表中的子视图位置(列)将与前一列表中的子视图位置(列)重叠。这就是为什么我们正在寻找一种方法来删除排队的单元格。

3 个答案:

答案 0 :(得分:1)

由于这是其他人可能会发现的情况,我会发布我们使用的解决方案,但我仍然对更多" native"这样做的方法。

以下是我们解决问题的方法:

当显示的记录集改变时,我们用当前单元格配置的唯一标识符更新UITableView(即用户当前正在查看的数据列表)。

然后,我们创建了一个UITableViewCell的自定义版本,并在创建时在单元格中记录唯一列表标识符。

当我们将可重复使用的单元格出列时,我们将视图的当前唯一标识符与存储在单元格中的唯一标识符进行比较,如果它们不匹配,我们将丢弃该单元格并创建一个新单元格。

希望这会有所帮助。

答案 1 :(得分:0)

ReloadData不会清除重用队列。它只是触发回调来重新读取重新加载行的数据。当每个单元格被加载时,如果你将其从重用队列中取出,它仍将被使用。即使重新使用表视图也很好,因为单元格类型是相同的类型,特别是因为您使用CellIdentifier来确保它。

但是,重叠数据有点奇怪。当您从重用队列中获取一个单元时,如何将数据放入其中?您是否直接在单元格上绘制数据?您是否在数据中添加子视图(导致多组重叠数据)?通常,单元格包含文本标签等子视图,并且数据设置在它们上面,因此没有数据重叠的情况 - 单元格的子视图只是更新了数据......

答案 2 :(得分:0)

您的GetCell方法需要确保已使用将要显示的新数据完全配置出列单元格。

一个常见的错误是假设只是将单元格出列显示将为您提供一个可以使用的新单元格。

如果您已经对单元格进行了任何自定义,例如添加视图,修改其属性(图像,公开指示符,背景颜色),则必须确保在重新使用单元格的GetCell方法中,每个属性都是在返回单元格之前正确设置。