UITableView的最后两个单元格中的信息与前两个单元格重复

时间:2011-11-23 16:21:13

标签: objective-c ios cocoa-touch uitableview

我有一个UITableView,它使用以下代码从XML加载数据。它正确加载信息,但数组中的最后两个单元格是前两个单元格的重复。我不知道我是不是装错了;在构建数组时我NSLog出值,它们是正确的。我也记录了最后一个数组,那没关系。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    ViewRoutesCell * aCell = (ViewRoutesCell *)[tableView dequeueReusableCellWithIdentifier:@"ViewRoutesCell"];

    if (aCell == nil)
    {   
        NSArray *arr = [[NSBundle mainBundle] loadNibNamed:@"ViewRoutesCell" owner:self options:nil];

        for (NSObject *anObj in arr) {

                AssessObject *newObj1 = [[AssessObject alloc] init];
                newObj1=[totalArray objectAtIndex:indexPath.row];
            UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:newObj1.routeImage]]];

                aCell = (ViewRoutesCell *)anObj;
                aCell.imgRoute.image = image;
                aCell.lblRouteText.text = newObj1.routeText;
                aCell.lblRouteImage.text = newObj1.routeImage;
        }
}
    return aCell;
}

它正在加载到自定义单元格。在我看来,问题可能与细胞的重复使用有关。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

您必须按以下方式重新编写代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    ViewRoutesCell * aCell = (ViewRoutesCell *)[tableView dequeueReusableCellWithIdentifier:@"ViewRoutesCell"];

    if (aCell == nil)
    {   
        NSArray *arr = [[NSBundle mainBundle] loadNibNamed:@"ViewRoutesCell" owner:self options:nil];
        aCell = (ViewRoutesCell *)[arr objectAtIndex:0];
    }

    AssessObject *newObj1 = [[AssessObject alloc] init];
    newObj1=[totalArray objectAtIndex:indexPath.row];
    UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:newObj1.routeImage]]];

    aCell.imgRoute.image = image;
    aCell.lblRouteText.text = newObj1.routeText;
    aCell.lblRouteImage.text = newObj1.routeImage;

    return aCell;
}

否则,您的单元格将使用旧值缓存。

答案 1 :(得分:1)

如果aCell!= nil

,您必须将值分配给单元格

如果aCell!= nil,则表示它找到了之前创建的可重用单元格。

因此,aCell保留您之前创建的内容并显示重复值

答案 2 :(得分:1)

以前的答案不是很清楚。

让我们一步一步。

<强>重用
当一个表格单元格离开屏幕时(例如不再可见),它会进入一个可供重复使用的单元格池,这些单元格被标记为reuseIdentifier,这可能与您的示例@"Cell"相似

为什么我们需要一个游泳池?
alloc / init'对象很昂贵,当滚动UITableView时,如果用户快速滚动,您可能会做很多事情。这会导致UITableView的滚动变得缓慢而且生涩。

那我该如何重复使用?
tableView: cellForRowAtIndexPath:方法的主要目的是让您的UITableView单元格显示。

所以你在这个方法中做的第一件事是调用方法dequeueReusableCellWithIdentifier:dequeueReusableCellWithIdentifier:方法将检查可重复使用的单元池,如果没有,则返回nil或返回UITableViewCell进行配置。

以下检查:

 if (aCell == nil) {

用于确定我们是否有一个我们可以配置的单元格,或者我们是否需要创建一个新单元格。

如果aCellnil,则没有UITableViewCell可供重复使用,因此我们需要创建一个并为其提供初始配置。这是设置颜色和其他属性的好时机,只需要设置一次

在此if块后,我们知道我们需要配置UITableViewCell,所以现在您可以继续为每个单元格设置不同的标签或属性。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    ViewRoutesCell * aCell = (ViewRoutesCell *)[tableView dequeueReusableCellWithIdentifier:@"ViewRoutesCell"];

    if (aCell == nil) {   
        // Create a new cell and do any one time config
    }

    // Configuration that is different for every cell

    return cell;
}

答案 3 :(得分:0)

请确保始终在-tableView:cellForRowAtIdexPath:实施中明确设置单元格内容的所有方面。如果您没有这样做,那么您未能设置的单元格中的任何视图将继续包含他们之前使用的任何内容。