UITableView,滚动后复制的图标

时间:2011-11-11 11:24:00

标签: iphone objective-c

我使用以下代码显示特定的UITableView:第一行必须显示一个图标,所有"内部"行不同的一行,最后还有另一个图标。所以,我们有三个图标,一个用于顶部单元格,一个用于"内部"细胞,一个用于底部细胞。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"cell"];

    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]autorelease];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;   
    }

    TabBarTestAppDelegate *delegate = (TabBarTestAppDelegate *)[[UIApplication sharedApplication] delegate];
    NSArray *local = delegate.myData;
    // ok, it's horrible, don't look at it   :-)
    cell.textLabel.text = [NSString stringWithFormat:@"%@%@", @"       " ,[local objectAtIndex:indexPath.row]];
    //
    NSString* name;
    if (indexPath.row == 0) {
        name = @"topicon";
    }
    else if (indexPath.row + 1 == [local count]) {
        name = @"bottomicon";
    }
    else {
        name = @"innericon";
    }
    //
    UIImage *leftIcon = [[UIImage alloc] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource:name ofType:@"png"]];
    //
    UIImageView *imageView = [[UIImageView alloc] initWithImage:leftIcon];
    [cell addSubview:imageView];
    imageView.frame = CGRectMake(20,0,30,44);
    [leftIcon release];
    [imageView release[;

    return cell;
}

会发生什么。第一次由模拟器加载UITableView时显然没有问题,但是,滚动后,它发生了一些奇怪的事情:第一个和最后一个单元格显示正确的图标AND ,在下面,另一个图标。底部和顶部图标下面的图标是"内部"图标,仅在indexPath.row!=0indexPath.row+1!=[local count]时显示。坦率地说,我不知道滚动时是否所有其他图标都重复,但这种效果非常明显。

我想象子视图可能存在一些问题,但是,作为一个客观的C新手,我无法想象究竟是什么。

感谢任何帮助。

4 个答案:

答案 0 :(得分:3)

TableView正在重复使用单元格,并且每次显示单元格时都会添加图像。

因此,当重复使用单元格时,您会添加另一个图像,但已经存在图像。

您必须重复使用图像视图,并且只在创建单元格时添加图像。

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifer];

    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifer]autorelease];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;   


        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20,0,30,44)];
        imageView.tag = 1001;
        [cell addSubview:imageView];
        [imageView release], imageView= nil;
    }

    TabBarTestAppDelegate *delegate = (TabBarTestAppDelegate *)[[UIApplication sharedApplication] delegate];
    NSArray *local = delegate.myData;
    // ok, it's horrible, don't look at it   :-)
    cell.textLabel.text = [NSString stringWithFormat:@"%@%@", @"       " ,[local objectAtIndex:indexPath.row]];
    //

    NSString* name = nil;;
    if (indexPath.row == 0) {
        name = @"topicon";
    }
    else if (indexPath.row + 1 == [local count]) {
        name = @"bottomicon";
    }
    else {
        name = @"innericon";
    }

    UIImageView *imageView = (UIImageView *)[cell viewWithTag:1001];
    imageView.image = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:name ofType:@"png"]];

    return cell;
 }

答案 1 :(得分:1)

一件事。不要一次又一次地添加新的图像视图。尝试重用它们。我在帖子here中给出了一个在单元格内重用组件的简单示例。

答案 2 :(得分:0)

我正在为此添加一个解决方案,因为我一直在打击这个问题一段时间,这里的大部分答案都是2 - 3年,现在有更好的方法可以解决这个问题。

在Storyboard编辑器中,您可以将多个原型单元格拖到UITableView中,并为它们提供不同的重用标识符,请执行以下操作:

enter image description here

if ( specialCase ) {
    UIColor *color = [UIColor colorWithRed:0.2 green:(0.8) blue:0.2 alpha:1.0];
    cell = [tableView dequeueReusableCellWithIdentifier:@"TopCellGreen" forIndexPath:indexPath];
    cell.textColor = color;
} else {
    cell = [tableView dequeueReusableCellWithIdentifier:@"TopCell"  forIndexPath:indexPath];
}

请注意不同的标识符。这将阻止您的自定义(绿色文本)在[重新]使用相同单元格的其他单元格中随机显示。

答案 3 :(得分:0)

有类似的问题。我需要将一个图像添加到我的表的最后一个单元格中,indexPath.row设置为15。

所以我使用了Glenn上面显示的技巧(tnx很多!),结果是这样的:

NSString *CellIdentifier = @"Cell";
if (indexPath.row==15)
    CellIdentifier=@"CamCell";
NuovaSegnalazioneCell *cell = (NuovaSegnalazioneCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil){
    cell = [[NuovaSegnalazioneCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
    cell.detailTextField.delegate = self;
    NSLog(@"INIT CELL %d",indexPath.row);
}

这样,第15个单元格具有不同的CellIdentifier,并且在滚动表格时不会在其他任何地方重复使用。