2011-11-07 44 views
1

我们有一个场景,在用户选择不同的UITableView中的某个项目时,我们重复使用相同的UITableView来显示数据库中的不同记录集合一个splitviewcontroller,但都在同一视图中)。如何删除可在UITableView(MonoTouch)中重复使用的单元格

当用户选择不同的区域进行查看时,我们从数据库中提取适当的记录,用新的一组记录更新Source并调用ReloadData。

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

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

更新与补充说明:

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

回答

1

由于这是其他人可能发现的情况他们自己,我会张贴我们使用的解决方案,但我仍然对更多的“原生”方式感兴趣。

下面是我们如何解决这个问题:

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

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

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

希望这会帮助路上的人。

+0

你怎么能丢弃细胞?它会导致内存泄漏,因为你永远不会使用该单元格,并且该单元格仍然存储在UITableView的可重用缓存中。 – nonamelive

0

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

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

+0

对不起,我忘了提及关于包含子视图的单元格的部分。我用更多的信息更新了这个问题。 –

0

您的GetCell方法需要确保出列单元完全配置了要显示的新数据。

一个常见的错误是假设只是出现显示的单元格会给你一个可以使用的新单元。

如果您已经对单元格进行了任何自定义,比如添加视图,修改其属性(图片,披露指标,背景颜色),您必须确保在GetCell方法中重用了单元格中的每一个属性在返回单元格之前正确设置。

+0

谢谢,我完全理解GetCell背后的概念,并且需要在每次传递时正确配置单元。然而,由于没有任何东西可以将一个单元与一个更高级别的概念(例如它所属的列表)联系起来,我所寻找的是一种方法来刷新标记为重用的单元的缓存,而不是必须采取我们最终实施的更长的路。 –

相关问题