带自定义单元格的UITableView

时间:2013-06-18 21:41:11

标签: uitableview nsarray nsdictionary

我有一个带有自定义UITableViewCells的UITableView,它使用NSDictionary来填充它们的标签和图像。我的问题是,我有一个从服务器返回的NSArray,里面有每个单元格(NSDictionaries)的信息。所有单元格都是UITableViewCell的子类,但我需要每个单元格使用不同的数组。这是一些代码:

//I use this method to create the cell, and build it using the NSDictionary passed to it
+ (CategoryCell *)generateCategoryCellWithInfo:(NSDictionary *)dict;
{
    CategoryCell *cell;
    NSArray *xib = [[NSBundle mainBundle] loadNibNamed:@"CategoryCell" owner:self options:nil];
    cell = [xib objectAtIndex:0];

    if (dict != nil)
    {
        //build the cell
        cell.videoTitle.font = [UIFont fontWithName:@"FuturaStd-CondensedBold" size:17.0f];
        cell.videoTitle.text = [dict objectForKey:@"title"];

        dispatch_async(dispatch_get_global_queue(0, 0), ^(void){
            NSData *fullImageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[dict objectForKey:@"fullImage"]]];
            if (!fullImageData)
            {
                return;
            }
            else
            {
                dispatch_async(dispatch_get_main_queue(), ^(void){
                    [cell.contentButton setImage:[UIImage imageWithData:fullImageData] forState:UIControlStateNormal];
                });
            }
        });

        cell.numberOfViewsLabel.text = [NSString stringWithFormat:@"%@ views", [dict objectForKey:@"views"]];
    }
    else
    {
        //set placeholders
        cell.numberOfViewsLabel.text = @"1200 people viewed this";
        cell.numberOfLikesLabel.text = @"20 people liked this";
        [cell.contentButton setImage:[UIImage imageNamed:@"video-table@2x.png"] forState:UIControlStateNormal];
        cell.videoTitle.text = @"A Baby Dances in its Car Seat or Something";
    }

    return cell;
}

这是创建单元格的位置

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CategoryCellIdentifier = @"categoryCell";
    CategoryCell *cell = (CategoryCell *)[tableView dequeueReusableCellWithIdentifier:CategoryCellIdentifier];

    if (!cell)
    {
        cell = [CategoryCell generateCategoryCellWithInfo:[itemsArray objectAtIndex:0]];
        cell.delegate = self;
    }

    return cell;
}

目前,我只是在NSArray itemsArray中使用第一个NSDictionary,但我想让每个单元格在itemsArray中传递一个不同的NSDictionary。有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

如果您在表格中使用0个部分:

只需将[itemsArray objectAtIndex: 0]改为[itemsArray objectAtIndex: indexPath.row]使用tableView:cellForRowAtIndexPath:方法。

如果您的表格中有多个section ,我建议您添加一个全局变量NSInteger indexCountForItemsArray;并在每次tableView:cellForRowAtIndexPath:时增加它调用。

在这两种情况下我会向tableViewController添加一个像-(void)setInfo:(NSDictionary)dict这样的公共方法,并在类方法+(CategoryCell*)generateCategoryCellWithInfo:(NSDictionary *)dict中添加相同/类似的代码:

- (void) setInfo : (NSDictionary*) dict {
    if (dict != nil) {
       //build the cell (your known code here)
    }
}

- (UITableViewCell*) tableView : (UITableView*) tableView 
         cellForRowAtIndexPath : (NSIndexPath*) indexPath
{
    static NSString *CategoryCellIdentifier = @"categoryCell";
    CategoryCell *cell = (CategoryCell *)[tableView dequeueReusableCellWithIdentifier:CategoryCellIdentifier];

    if (cell == nil) {
        cell = [CategoryCell generateCategoryCellWithInfo : [itemsArray objectAtIndex: indexCountForItemsArray]];
        cell.delegate = self;
    } else {
        [cell setInfo : [itemsArray objectAtIndex: indexCountForItemsArray]];
    }

    self.indexCountForItemsArray += 1; 
    return cell;
}

希望这可以帮助你。