【问题标题】:UITableviewcell duplicate content [IOS]UITableviewcell重复内容[IOS]
【发布时间】:2017-05-17 12:38:48
【问题描述】:

我有一个tableView,包含三个部分。最初存在单元格内容重复的问题。

通过将单元格的重用标识符设置为nil 来解决。之后,在第 3 部分的第一个单元格的位置出现黑条/颜色,就像在this 屏幕截图上一样。

This 是我以前的问题。并将单元实现更改为,

static NSString *cellIdentifier=[NSString stringWithFormat:@"Cell%ld%ld",(long)indexPath.section,(long)indexPath.row];

UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];;

if(cell==nil){

    cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];


}

有人知道是什么原因吗?任何帮助表示赞赏。

【问题讨论】:

  • 添加一些代码和截图
  • 不要将重用标识符设置为nil。这真是糟糕的代码。为您最初的问题找到另一个解决方案或在此处提出相关问题。
  • 请告诉我们你tableView的实现!
  • @DarjiJigar 请检查随附的屏幕截图。
  • @RagheeM 不在 cmets 中发布代码。请编辑您的原始问题。

标签: ios objective-c uitableview


【解决方案1】:

首先,单元格内容重复的最可能原因是单元格的子视图没有被重用,而是在每次配置单元格并将其添加到视图层次结构时创建。旧的子视图没有被删除,因此重复的内容。

要修复它,请在单元格初始化阶段创建所需的所有子视图。在单元格配置期间,仅使用内容更新这些视图,更改它们的大小,但不要创建新视图或删除旧视图。

通过覆盖和实现 prepareForReuse() PrepareForReuse method description 将单元格重置为默认外观

最后,将重用标识符设置为nil 是一种不好的做法,并且可能导致未定义的行为(如屏幕截图所示)。 Cell 的重用标识符是在其初始化期间设置的,不应在 Cell 生命周期中更改。

【讨论】:

  • 初始化期间未设置单元的重用标识符。单元格与标识符无关,tableView 是使用 id 的单元格。但是,将重用标识符设置为nil 是不好的做法,但并不是因为它会导致意外行为,我们知道会发生什么。 tableView 不会重复使用单元格,它会在每次显示单元格时创建一个新的 UITableViewCell 实例。如果您有大量单元格,这可能会导致性能问题,例如在 tableView 中滚动会超级慢。
  • @richard topchiy 抱歉,它对我不起作用。可以分享一下代码吗?
  • @dirtydanee,在我附上的链接中是 UITableViewCell 指定初始化程序的描述。它需要reuseIdentifier 或nil。据我所知,在创建单元后无法更改重用标识符,因此必须在初始化阶段提供重用标识符。 developer.apple.com/reference/uikit/uitableviewcell/…
【解决方案2】:

查看您的代码,您似乎正在为每个单元格创建一个新标识符。

[NSString stringWithFormat:@"Cell%ld%ld",(long)indexPath.section,(long)indexPath.row]

此行将为每一行创建一个新标识符,例如Cell00Cell01 等。

但是,它不应该是动态的,它应该是,就像变量前缀所暗示的那样,static

static NSString *cellIdentifier= @"Cell"; // or whatever is it in IB or registered by
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];;

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

此外,当您忘记实现prepareForReuse() 时,可能会发生重复。这是函数,当您的单元被重用时,操作系统将调用该函数。您可以将所有值设置为nil,从而避免重复。

示例:

- (void)prepareForReuse {
    [super prepareForReuse];
    // Then Reset here back to default values that you want.
    self.titleLabel.text = nil;
    self.imageView.image = nil; 
}

【讨论】:

  • 我试过这个。那个黑色被移除了。之前的问题又发生了。参考截图2
  • 截图2到底有什么问题?
  • 第 2 节中的内容复制。第 2 节中的内容是一个 UIView,它在滚动时也会出现在另一个单元格中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
相关资源
最近更新 更多