我需要在将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];
}
答案 0 :(得分:0)
在cellForRowAtIndexPath
中,您总是创建并返回一个新的单元格实例,这意味着当您重新加载表格时,由于异步下载而进行的任何修改都会被自动丢弃(因为您只是单元格添加了子视图被销毁)。如果你不重新加载表,它应该可以工作。
如果您致电addCellImages
,这也是一个问题。在进行调用之前,您需要切换回主线程,因为UI只能从主线程更新。
你在哪里:
MyCell *cell = (MyCell *)[self tableView:table cellForRowAtIndexPath:path];
这个威尔也创造了一个新的细胞。你想要做的是从表格视图中获取当前单元格:
MyCell *cell = (MyCell *)[table cellForRowAtIndexPath:path];
答案 1 :(得分:0)
你应该尝试Fully-Loaded - 在遇到这些问题时非常方便。