【问题标题】:Table view cells duplicate UIViews while scrolling表格视图单元格在滚动时重复 UIViews
【发布时间】:2016-03-07 08:53:04
【问题描述】:

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

但是现在当我启动我的应用程序并在我的表格视图中上下滚动几次时,不知何故我的 UIViews 会重复。每次我上下滚动应用程序都会“创建”新的 UIView。

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

【问题讨论】:

  • 请您发布您的代码,也许您的问题是您忽略了 dequeueReusableCellWithIdentifier 将获取旧单元格而不是创建新单元格这一事实,所以请发布您的完整代码以告诉您在哪里问题是
  • 能否请您发布您的 cellforrowatindexpath 方法?

标签: objective-c xcode uiview tableview


【解决方案1】:

为了尽可能高效,tableview 所做的是将以前的单元格重新用作新单元格。所以想象一下,当你向下滚动时,一个在屏幕顶部消失的单元格很快从屏幕外移开,并放置在屏幕底部(再次在屏幕外),成为新出现的那个单元格。因此,虽然您的印象是在幕后是一张满是单元格的长表格,但实际上 - 您可以看到几乎所有存在的单元格,除了顶部和底部屏幕外的一两个单元格。

现在您已经描绘了这一点,假设您配置的单元格(在您的情况下通过向其添加视图)从其顶部的位置移到底部以成为一个新单元格。但是没有人告诉该单元格摆脱您为其提供的添加视图。所以那些额外的视图仍然存在,然后你再次调用 -cellForRowAtIndexPath,又添加了两个视图,变成 4。然后下一次是 6,然后是 8,然后继续。这是你的问题。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多