如何清除tableview单元以供重用

时间:2011-12-12 15:21:36

标签: objective-c ios uitableview

我正在重写一些代码以提高tableview的性能。我正在尝试实现dequeueReusableCellWithIdentifier,但没有太多运气。

当一个单元格从屏幕上移开并再次打开时,它的内容会重复(每次都会关闭并重新进入屏幕)。当它们不应该出现时,细胞的内容也出现在其他细胞中。

在我看来,当重复使用单元格时,内容需要清除,但我无法弄明白。

单元格本身由4个CUSTOM图像按钮和4个标签组成:

[ ]  [ ]  [ ]  [ ]
abc  abc  abc  abc

某些单元格可能已填充所有这些图像/标签,其他单元格可能只有1或2。

以下代码..

- (UITableViewCell *)tableView:(UITableView *)thetableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //NSString *CellIdentifier = [NSString stringWithFormat:@"Cell",indexPath.section];
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }
    else
    {
        //Tried this to clear old contents but doesn't make a difference
        for (HomeScreenButton* b in cell.subviews)
        {
            NSLog(@"RemovedOldButton");

            b = nil;
        }
        for (UILabel* b in cell.subviews)
        {
            NSLog(@"RemovedOldLabel");

            b = nil;
        }
    }
    cell.accessoryType = UITableViewCellAccessoryNone;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    int section = indexPath.section;


    NSMutableArray *sectionItems = [sections objectAtIndex:section]; //Gets the array of objects for this section 
    if (sectionItems.count == 0) return cell;

    LepidEntity * le = [sectionItems objectAtIndex:0];// Gets the object for this section (family/group etc.)


    if (([le.type isEqualToString:@"family"]) || ([le.type isEqualToString:@"group"]))
    {
        NSMutableArray * tmpAnn;
        int annCount = 0;
        //Get annotations for this family/group
        if ([le.type isEqualToString:@"family"])
        {
            Family * family = (Family *)le;
            tmpAnn = [[NSMutableArray alloc]initWithArray:family.annotations];
        }
        else
        {
            Group * group = (Group *)le;
            tmpAnn = [[NSMutableArray alloc]initWithArray:group.annotations];

        }
        annCount = tmpAnn.count;
        //We want to start at the last item in the array. indexPath.row*4. First row would be 0 then 4, then 8 etc.
        for (int i = indexPath.row*4;i < tmpAnn.count;i++)
        {
            Annotation * theAnnotation = [tmpAnn objectAtIndex:i];
            CGRect bRect = CGRectMake(i*80, 5, 80, 80);
            HomeScreenButton *button = [self getResultsViewButton:bRect imagePath:theAnnotation.image cellForRowAtIndexPath:indexPath i:i entity:theAnnotation];
            [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
            [cell.contentView addSubview:button];
            [button release];
            button = nil;
            //Get and configure the label
            CGRect lRect = CGRectMake(i*80, 80, 100, 16);
            UILabel *label = [self getResultsViewLabel:lRect text:theAnnotation.name cellForRowAtIndexPath:indexPath i:i];
            [cell.contentView addSubview:label];
            [label release];
            label = nil;
        }
    }
    else
    {
        Species * s;
    }

    return cell;}

-(HomeScreenButton *) getResultsViewButton:(CGRect)rect imagePath:(NSString *)image 

    cellForRowAtIndexPath:(NSIndexPath *)indexPath i:(int)i entity:(LepidEntity *)entity
    {
        HomeScreenButton *button=[[HomeScreenButton alloc] initWithFrame:rect];

        image = [image stringByReplacingOccurrencesOfString:@"Images/" withString:@"Thumbs/"];

        UIImage *buttonImageNormal=[UIImage imageWithContentsOfFile:GetFullPath(image)];//imageNamed:image];
        [button setBackgroundImage:buttonImageNormal forState:UIControlStateNormal];
        [button setContentMode:UIViewContentModeCenter];
        NSString *tagValue = [NSString stringWithFormat:@"%d%d", indexPath.section+1, i];
        button.tag = [tagValue intValue];
        button.entity = entity;
        return button;
    }

2 个答案:

答案 0 :(得分:1)

您应该致电[b removeFromSuperview]而不是将其设为nil。

答案 1 :(得分:0)

删除第一个其他条件..