ios - UITableViewCell 滚动时显示错误数据
Posted
技术标签:
【中文标题】ios - UITableViewCell 滚动时显示错误数据【英文标题】:ios - UITableViewCell display wrong data when scrolling 【发布时间】:2014-05-21 04:49:20 【问题描述】:这是我的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifierNormal = @"CellNormal";
static NSString *CellIdentifierTracking = @"CellTracking";
switch (self.mapState)
case MapStateNormal:
// UITableViewCell *cell = [self.table dequeueReusableCellWithIdentifier:CellIdentifierNormal];
// if (cell == nil)
UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierNormal];
//
[cell.textLabel setText:@"abc"];
return cell;
case MapStateTracking:
// UITableViewCell *cell = [self.table dequeueReusableCellWithIdentifier:CellIdentifierTracking];
// if (cell == nil)
UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierTracking];
//
if (indexPath.row == 0)
[cell.textLabel setText:@"Lorem ipsum"];
else
NSURL *url = [LoremIpsum URLForPlaceholderImageFromService:LoremIpsumPlaceholderImageServicePlaceKittenCom
withWidth:1024
height:1024];
[cell.imageView setImageWithURL:url
placeholderImage:[UIImage imageNamed:@"MenuButton"]];
return cell;
default:
break;
return nil;
这段代码运行良好,但不是最佳实践,因为我每次都重新创建UITableViewCell
。显示如下:
但是,当我取消注释上面的这些行以启用 dequeueReusableCell
时,表格会显示其单元格,其中包含类似这样的错误(黄色部分是我的代码):
你可以看到第一行有一个UIImage
,下面的一些行有文字,而我显然没有在我的代码中设置它。
我能做些什么来解决这个问题?还是我应该坚持第一种方法?
谢谢。
【问题讨论】:
【参考方案1】:您确实应该重新使用表格视图单元格,因为如果您一直重新创建它们会产生很多开销,即注释掉的代码是正确的。
接下来,docs 说:“tableView:cellForRowAtIndexPath:
中的表格视图的委托在重用单元格时应该始终重置所有内容。”
如果您不重置内容,它将再次显示。
所以我建议你设置
cell.imageView.image = nil;
在您的 -(UITableViewCell *)tableView:cellForRowAtIndexPath:(NSIndexPath *)indexPath
方法中。
【讨论】:
好的,谢谢。我虽然重置内容是一个自动操作,每次要重用单元格时都会执行。【参考方案2】:只需为您不想显示任何文本的每个单元格设置[cell.textLabel setText:@""];
。单元格与之前的文本重复使用,因此您需要清除它。
【讨论】:
【参考方案3】:试试这个,如果是cell != nil
则清除单元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifierNormal = @"CellNormal";
static NSString *CellIdentifierTracking = @"CellTracking";
switch (self.mapState)
case MapStateNormal:
UITableViewCell *cell = [self.table dequeueReusableCellWithIdentifier:CellIdentifierNormal];
if (cell == nil)
UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierNormal];
else
[cell.textLabel setText:@""];
[cell.imageView setImage:nil];
...
return cell;
case MapStateTracking:
UITableViewCell *cell = [self.table dequeueReusableCellWithIdentifier:CellIdentifierTracking];
if (cell == nil)
UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierTracking];
else
[cell.textLabel setText:@""];
[cell.imageView setImage:nil];
....
return cell;
default:
break;
return nil;
【讨论】:
以上是关于ios - UITableViewCell 滚动时显示错误数据的主要内容,如果未能解决你的问题,请参考以下文章
在 UITableviewCell (ios7) 中嵌入的 UITableView 中滚动
iOS7 在 UITableViewCell 中以适当的偏移量编辑 UITextField 时滚动到 UITableViewController 的行
滚动时如何向 UITableViewCell 添加更多按钮?