2016-03-07 73 views
0

我有一个视图控制器与表视图。在设置单元格/单元格文本的方法中,我在该视图中创建了UIView和UILabel。然后我将UIView添加到单元格中。所以表格视图中的每个单元格都有一个UIView。所以我创建了聊天泡泡。表视图单元格滚动时重复UIViews

但现在当我开始我的应用程序,并在我的表视图中上下滚动几次,不知何故我的UIViews得到重复。每当我滚动应用程序“创建”新的UIViews。

你知道我在做什么错吗?我稍后会发布我的Objective-C代码。 谢谢你的帮助。

+0

请问您是否发布您的代码,也许您的问题是,您忽略了dequeueReusableCellWithIdentifier将获取旧单元格而不是创建新单元的事实,因此请发布完整代码以告诉您问题出在哪里 –

+0

您可以请发布您的cellforrowatindexpath方法? – alicanbatur

回答

0

tableview做的尽可能高效,就是重用先前的单元格作为新单元格。所以想象一下,当你向下滚动时,一个在屏幕顶部消失的单元会很快从屏幕外被取出,并放置在屏幕的底部(再次离开屏幕),成为新出现的单元格。所以,尽管你有这样的印象:一张长满桌子的桌子在幕后,事实上 - 你几乎可以看到所有存在的单元格,除了在屏幕顶部和底部的一两个屏幕外。

所以,现在你已经描述了这一点,想象你配置的单元格,在你的情况下,通过添加视图,从顶部的位置移动到底部,成为一个新的单元格。但是没有人告诉那个牢房摆脱你给予的附加观点。因此,这些额外的视图仍然存在,然后再次调用-cellForRowAtIndexPath,并添加两个视图,变为4.然后下一次是6,然后是8,继续。这是你的问题。

处理此问题的两种方法是:使用故事板或笔尖,并将您的自定义单元格外观置于其中一个界面生成器文件中。编译器将知道不要复制这些额外的视图。大多数UITableViewCells都是这样控制的。它可能需要一点时间才能找到一个教程,并学习这种技术,但从长远来看它非常值得。

另一种方法是创建你自己的UITableViewCell的子类。然后,您可以在其中重写方法 - 例如。通过使用init方法,您可以在该方法中以编程方式添加视图,这意味着您的单元格被重新使用时不会调用该方法,因为显然它们不会被初始化两次(它们在整个重新使用期间仍然存在)使用)。然后,您可以访问另一个方便的方法-prepareForReuse,该方法在您的单元格被交换并用于不同的表格单元格之前调用,从而允许(例如)清除您为以前的单元格填充的数据。

相关问题