有条件地将图像添加到自定义cell.contentView属性

时间:2011-10-22 18:12:05

标签: cocoa-touch uitableview

我想创建一个UITableViewCell,在内容和附件视图之间有一个图像,如果满足某些条件,就会发生声音。

所以我必须使用两个UILabel和UIImageView创建一个自定义内容视图,如“Table View Programming Guide for iOS”中所述。

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

    YOEvento *aux = [[self.eventosListsContainer objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

        // 1. Check if it is a favourtite to display the icon

        if (aux.isFavourite) {
            // Evento is favourite
            // 1. Create the main label view
            mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(20, 8, 248, 14)] autorelease];
            mainLabel.tag = MAINLABEL_TAG;
            mainLabel.font = [UIFont systemFontOfSize:13.0];
            mainLabel.textColor = [UIColor darkGrayColor];
            mainLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
            [cell.contentView addSubview:mainLabel];

            // Create the date label
            secondLabel = [[[UILabel alloc] initWithFrame:CGRectMake(23, 24, 245, 11)] autorelease];
            secondLabel.tag = SECONDLABEL_TAG;
            secondLabel.font = [UIFont systemFontOfSize:11.0];
            secondLabel.textColor = [UIColor lightGrayColor];
            secondLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
            [cell.contentView addSubview:secondLabel];

            // Create the image
            icon = [[[UIImageView alloc] initWithFrame:CGRectMake(268, 12, 24, 21)] autorelease];
            icon.tag = ICON_TAG;
            icon.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
            [cell.contentView addSubview:icon];

        } else {
            // Evento is not favourite
            // 1. Create the main label view
            mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(20, 8, 282, 14)] autorelease];
            mainLabel.tag = MAINLABEL_TAG;
            mainLabel.font = [UIFont systemFontOfSize:13.0];
            mainLabel.textColor = [UIColor darkGrayColor];
            mainLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
            [cell.contentView addSubview:mainLabel];

            // Create the date label
            secondLabel = [[[UILabel alloc] initWithFrame:CGRectMake(23, 24, 279, 11)] autorelease];
            secondLabel.tag = SECONDLABEL_TAG;
            secondLabel.font = [UIFont systemFontOfSize:11.0];
            secondLabel.textColor = [UIColor lightGrayColor];
            secondLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
            [cell.contentView addSubview:secondLabel];            

        }
    } else {
        // 
        if (aux.isFavourite) {
            mainLabel = (UILabel *)[cell.contentView viewWithTag:MAINLABEL_TAG];
            secondLabel = (UILabel *)[cell.contentView viewWithTag:SECONDLABEL_TAG];
            icon = (UIImageView *)[cell.contentView viewWithTag:ICON_TAG];
        } else {
            mainLabel = (UILabel *)[cell.contentView viewWithTag:MAINLABEL_TAG];
            secondLabel = (UILabel *)[cell.contentView viewWithTag:SECONDLABEL_TAG];            
        }
    }

    // Load cell values

    if (aux.isFavourite) {
        mainLabel.text = aux.nombre;
        secondLabel.text = @"16 de Octubre"; // ?????????????
        icon.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"29-heart"
                                                                                      ofType:@"png"]];
    } else {
        mainLabel.text = aux.nombre;
        secondLabel.text = @"16 de Octubre"; // ????????????? 
    }    
    return cell;
}

问题是图标图像是随机加载的,因为它在重复使用单元格时会一直显示。 我不得不承认我并不完全理解重用细胞理论。

在我原来的实现中(使用imageView属性)很容易,我只是检查事件不是设置cell.imageView = nil的最爱。但不知道如何处理自定义contentView。

1 个答案:

答案 0 :(得分:2)

创建单元格后,您需要重新安排其内容 - 这会增加不必要的复杂性。相反,你应该创建两种不同的细胞类型 - 一种用于收藏,一种用于非收藏。尝试这样的事情:

static NSString *CellIdentifierFavourite = @"CellFavourite";
static NSString *CellIdentifierNonFavourite = @"CellNonFavourite";

//  Other setup goes here

YOEvento *aux = [[self.eventosListsContainer objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

if (aux.isFavourite) {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifierFavourite];
    if (cell == nil) {
        //  Create favourite cell here
    }
    // Populate favourite cell here
} else {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifierNonFavourite];
    if (cell == nil) {
        //  Create non-favourite cell here
    }
    // Populate non-favourite cell here
}

//  Rest of method goes below