ios - UITableViewCell在滚动时显示错误的数据

时间:2014-05-21 04:49:21

标签: ios objective-c uitableview

这是我的代码:

- (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。它显示如下:

Correct Display

但是,当我取消注释上面的这些行以启用dequeueReusableCell时,表格会显示其单元格,如下所示(黄色部分是我的代码):

enter image description here enter image description here

您可以看到第一行中有UIImage,下面某些行中有文字,但我显然没有在我的代码中设置它。

我该怎么做才能解决这个问题?还是应该坚持使用第一种方法?

感谢。

3 个答案:

答案 0 :(得分:6)

您应该重新使用表格视图单元格,因为如果您一直重新创建它们会产生大量开销,即输出的注释代码是正确的。
接下来,docs说:" tableView:cellForRowAtIndexPath:中的表格视图代表应该在重复使用单元格时重置所有内容。"
如果您不重置内容,它将再次显示 所以我建议你设置

cell.imageView.image = nil; 

-(UITableViewCell *)tableView:cellForRowAtIndexPath:(NSIndexPath *)indexPath方法中。

答案 1 :(得分:1)

只需为每个单元格设置[cell.textLabel setText:@""];,您不想显示任何文本。单元格与之前的文本一起使用,因此您需要清除它。

答案 2 :(得分:1)

尝试此操作,清除单元格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;
}