views:

386

answers:

1

I'm wondering if it is possible to add cell content to a uitableview based on the row index?

For example if it is the first cell (row 0) I want to add an image and text. If it is the second row I would like to add a button. For all other rows I would like to just add a line of text.

I tried using indexPath.row. It worked the first time but when I scroll off of the screen and then back up my first image dissapears.

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

    PromoListItem *promo = [promoList objectAtIndex:indexPath.row];

    static NSString *CellIdentifier = @"Cell";

    AsyncImageView *asyncImageView = nil;
    UILabel *label = nil;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(indexPath.row==0)
    {
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        CGRect frame;
        frame.origin.x = 0;
        frame.origin.y = 0;
        frame.size.width = 100;
        frame.size.height = 100;

        asyncImageView = [[[AsyncImageView alloc] initWithFrame:frame] autorelease];
        asyncImageView.tag = ASYNC_IMAGE_TAG;
        [cell.contentView addSubview:asyncImageView];


        frame.origin.x = 110;
        frame.size.width =100;
        label = [[[UILabel alloc] initWithFrame:frame] autorelease];
        label.tag = LABEL_TAG;
        [cell.contentView addSubview:label];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    } else {
        asyncImageView = (AsyncImageView *) [cell.contentView viewWithTag:ASYNC_IMAGE_TAG];
        label = (UILabel *) [cell.contentView viewWithTag:LABEL_TAG];
    }

    NSURL *url = [NSURL URLWithString:promo.imgurl];

    [asyncImageView loadImageFromURL:url];

    label.text = promo.artistname;
    }else

    {

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
            CGRect frame;
            frame.origin.x = 0;
            frame.origin.y = 0;
            frame.size.width = 100;
            frame.size.height = 100;

            //asyncImageView = [[[AsyncImageView alloc] initWithFrame:frame] autorelease];
        //  asyncImageView.tag = ASYNC_IMAGE_TAG;
        //  [cell.contentView addSubview:asyncImageView];


            frame.origin.x = 110;
            frame.size.width =100;
            label = [[[UILabel alloc] initWithFrame:frame] autorelease];
            label.tag = LABEL_TAG;
            [cell.contentView addSubview:label];
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        } else {
        //  asyncImageView = (AsyncImageView *) [cell.contentView viewWithTag:ASYNC_IMAGE_TAG];
            label = (UILabel *) [cell.contentView viewWithTag:LABEL_TAG];
        }

        //NSURL *url = [NSURL URLWithString:promo.imgurl];

        //[asyncImageView loadImageFromURL:url];

        label.text = promo.artistname;



    }

    return cell;
}
A: 

How customized do you want these cells? If you are only adding text, images and accessory buttons, you can create the cell outside of your row check, and then add the needed items inside those if statements.

 cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    NSUInteger row = [indexPath row];
    switch(row) {
        case 0:
            cell.textLabel.text = @"row 0";
            cell.image
            break;
        case 1:
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            break;
        default:
            cell.textLabel.text = [NSString stringWithFormat:@"row %d",row];
            break;      
    }

    return cell;

However, the row will change when you start to recycle your cells, you may want to have something in the actual data that indicates how the cell should behave.

Bryan Clark
Thanks. I think I'm going to abandon this approach though. I originally wanted 6 cells. Cell 0 had an image and some large labels and the other 5 just had text.It worked fine when the app first loads but once you start scrolling the image from row 0 vanishes and part of it ends up in cell 6. Instead I might just add a UIImage and a tableview with 5 cells to a UIViewController instead of trying to do it all in a UITableViewController
dubbeat
yeah if you are using less then 10 cells, don't even worry about requeue-ing them.
Bryan Clark