【问题标题】:UITableView Repeating ContentUITableView 重复内容
【发布时间】:2014-02-16 21:44:44
【问题描述】:

我知道这是一个古老的问题,但这次我有点扭曲。

正如标题所说,我的 UITableView 正在重复内容。在这种情况下,单元格的背景颜色会发生变化,当滚动它并返回屏幕时它不应该发生变化。

我知道这可能是由于重复使用了单元格,但我的问题是我不能只给每个单元格一个唯一的单元格标识符,因为我已经在我的 Storyboard 中构建了我的单元格,这需要在其中输入它。

那么我怎样才能解决这个问题,同时将我的单元设计保留在我的故事板中?

一点代码:

    static NSString *cellIdentifier = @"Cell";
        SLDetailCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

        if (!cell)
        {
            cell = [[SLDetailCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }

    [cell setBackgroundColor:[UIColor slateBackgroundGrey]]; //Set standard background colour
    [cell.titleLbl setText:[self.tableTitles objectAtIndex:indexPath.row]]; //cell titles from an array (static data I made)

    //This will occur for each cell, here are two examples
    if ([cell.titleLbl.text isEqualToString:@"Aircraft"])
    {
        NSString *detailText = @"";
        if (!self.flight.aircraft) detailText = @"N/A";
        else detailText = self.flight.aircraft.name;
        [cell.detailLbl setText:detailText];
    }
    if ([cell.titleLbl.text isEqualToString:@"Delete"])
    {
        UIView *containerView = [cell.titleLbl superview];
        [containerView setBackgroundColor:[UIColor triggerRed]];
        [cell.titleLbl setTextColor:[UIColor whiteColor]];
        [cell.disclosureIndicator setHidden:YES];
        [cell.detailLbl setText:@""];
    }

在删除单元格的情况下,我更改了单元格的颜色属性。

prepareForReuse 子类化以重置单元格数据无法停止重复数据,在每个单独的单元格中设置颜色 if 语句也是如此(如您在上面看到的)。

谢谢。

【问题讨论】:

  • 设置背景颜色的代码在哪里?
  • 哦,有什么不同?这听起来就像每个人在重复使用不当时都会遇到的问题。
  • 我见过的每一个解决方案,几十个都通过使用唯一的单元格标识符来解决这个问题,但是当你使用故事板时,这是没有用的。就是这样,只是我正在使用故事板:)
  • 如果人们仅仅因为颜色不同而使用唯一的重用标识符,那么他们就做错了。再次,发布您设置背景的相关代码,以便我们向您展示正确的方式。
  • 好的,我已经添加了所有需要的代码(希望如此),交叉手指可以更清楚地说明问题。

标签: ios objective-c uitableview


【解决方案1】:

无论何时返回一个单元格,无论是否重复使用,都必须配置所有单元格属性。否则,您会遇到一些属性从上次出现的情况。这适用于单元格是从情节提要还是其他方式创建的,这是单元格重用问题,仅此而已。

【讨论】:

  • 你应该得到一个拥抱徽章,因为它实际上被另一个用户拥抱了。
【解决方案2】:

您似乎有一个自定义的UITableViewCell 子类。您可以覆盖该类中的 prepareForReuse 方法并重置背景颜色(或其他任何您想要重置的颜色)。

确保在您的实现中调用[super prepareForReuse]

【讨论】:

    【解决方案3】:

    来自 Apple 文档:

    tableView:cellForRowAtIndexPath: 中的 table view 的委托应该 重用单元格时始终重置所有内容。

    来源: UITableViewCell Class Reference

    所以一定要在那里设置你的背景颜色。

    希望对你有帮助。

    【讨论】:

    • 初始化单元格后我做的第一件事就是设置背景颜色。然后,如果它是“删除”单元格,我会更改颜色。还是我需要在每个单元格的每个 if 案例中设置颜色?
    • 如果“删除”单元格与下一个单元格具有相同的重用 ID,那么您应该始终设置适当的背景颜色。其他解决方案可能是为“删除”单元格设置一个单独的重用 ID。
    【解决方案4】:

    这个 SO 答案包含答案为什么以及如何使用 UITableViewCell dequeue。当你知道你会知道为什么内容重复时:iPhone - dequeueReusableCellWithIdentifier usage

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多