滚动时表视图单元格复制UIViews

时间:2016-03-07 08:53:04

标签: objective-c xcode uiview tableview

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

但是现在当我启动我的应用程序并在我的表视图中上下滚动一些时间时,我的UIViews会以某种方式重复。每次我上下滚动应用程序"创建"新的UIViews。

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

1 个答案:

答案 0 :(得分:0)

尽管桌面视图尽可能高效,但重新使用以前的单元格作为新单元格。因此,想象一下,当您向下滚动时,屏幕顶部消失的单元格会从屏幕外快速拍摄,并放置在屏幕底部(再次在屏幕外),成为新显示的单元格。因此,虽然你会得到一个充满细胞的长桌在幕后的印象,事实上 - 你可以看到几乎所有的细胞,除了一两个刚出现在屏幕顶部和底部的细胞。

所以现在您已经想到了这一点,想象一下您配置的单元格,在您的情况下通过向其添加视图,从顶部的位置取出并移动到底部以成为新单元格。但没有人告诉那个细胞去除你给它的额外观点。所以这些额外的视图仍然存在,然后再次调用-cellForRowAtIndexPath,再添加两个视图,变为4.然后下一次6,然后是8,然后打开和继续。这是你的问题。

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

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