UITableViewCell只能在cellForRowAtIndexPath中添加子视图

时间:2013-07-20 21:51:47

标签: ios objective-c uitableview

我需要在将UIImageView添加到UITableViewCell之前从远程获取图像列表,所以我首先渲染没有图像的表,然后将图像添加到异步提取的回调中的单元格中列表,但我发现在表格渲染后无法添加子视图。

我尝试添加[tableView reloadData],但它没有修复它。

ViewController.m:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     MyCell *cell = [[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"myCell"];
     // [cell setBackgroundImg:@"http://www.domain.com/uploads/2013/0708/big_886a91103d2.jpg" maskImg:nil fromTable: tableView];
     // above line works
     return cell;
}

/* this is the callback called after the list of image loaded.
 * I'm sure it works like the line I commented out above, but it can't add subview 
 */
- (void)addCellImages:(NSDictionary *)images
{
    for (int i = 0; i < [images count]; i++)
    {
        int row = (i + 1) * 2;
        NSIndexPath *path = [NSIndexPath indexPathForRow:row inSection:0];
        MyCell *cell = (MyCell *)[self tableView:table cellForRowAtIndexPath:path];
        if (row == 2)
            [cell setBackgroundImg:[images valueForKey:@"shop"] maskImg:nil fromTable:table];
        if (row == 4)
            [cell setBackgroundImg:[images valueForKey:@"guide"] maskImg:nil fromTable:table];
        if (row == 6)
            [cell setBackgroundImg:[images valueForKey:@"coupon"] maskImg:nil fromTable:table];
        if (row == 8)
            [cell setBackgroundImg:[images valueForKey:@"prize"] maskImg:nil fromTable:table];
    }
}

MyCell.m

- (void)setBackgroundImg:(NSString *)backgroundImg maskImg:(NSString *)maskImg fromTable: (UITableView *)table
{
    NSURL *bgURL = [[NSURL alloc] initWithString:backgroundImg];
    UIImageView *bgImageView = [[UIImageView alloc] init];
    [bgImageView setImageWithURL:bgURL completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType){[table reloadData];}]; 
    // Above line uses SDWebImage to load image async, I thought reloadData can make it work, but it didn't
    bgImageView.frame = CGRectMake(0, 0, 240., 70.);
    [self addSubview:bgImageView];
}

2 个答案:

答案 0 :(得分:0)

cellForRowAtIndexPath中,您总是创建并返回一个新的单元格实例,这意味着当您重新加载表格时,由于异步下载而进行的任何修改都会被自动丢弃(因为您只是单元格添加了子视图被销毁)。如果你不重新加载表,它应该可以工作。


如果您致电addCellImages,这也是一个问题。在进行调用之前,您需要切换回主线程,因为UI只能从主线程更新。


你在哪里:

    MyCell *cell = (MyCell *)[self tableView:table cellForRowAtIndexPath:path];

这个威尔也创造了一个新的细胞。你想要做的是从表格视图中获取当前单元格:

    MyCell *cell = (MyCell *)[table cellForRowAtIndexPath:path];

答案 1 :(得分:0)

你应该尝试Fully-Loaded - 在遇到这些问题时非常方便。