Iphone UITableView显示UIImageView或UIProgressView的单元格

Iphone UITableView显示UIImageView或UIProgressView的单元格,iphone,ios,uitableview,storyboard,uiprogressview,Iphone,Ios,Uitableview,Storyboard,Uiprogressview,我正在异步下载图像并在UITableView中显示它们。下载图像时,相应的表行中应显示UIProgressView。下载完成后,进度视图应替换为实际图像 我使用的是故事板,我将UITableViewCell子类化为一个名为ResponseTableViewCell的类,该类具有UIImageView(responseView)和UIProgressView(progressView)的IBOutlets。由于某些原因,我无法在下载完成后隐藏进度视图。如果我不隐藏它,它会显示在下载的图像的顶部。如

我正在异步下载图像并在UITableView中显示它们。下载图像时,相应的表行中应显示UIProgressView。下载完成后,进度视图应替换为实际图像

我使用的是故事板,我将UITableViewCell子类化为一个名为ResponseTableViewCell的类,该类具有UIImageView(responseView)和UIProgressView(progressView)的IBOutlets。由于某些原因,我无法在下载完成后隐藏进度视图。如果我不隐藏它,它会显示在下载的图像的顶部。如果我试图隐藏它,它将隐藏每一行。我猜这与细胞的再利用有关

我还尝试创建了两个自定义单元格:一个带有UIImageView,另一个带有UIProgressView。但在故事板中,我可以添加UITableViewCell的唯一方法是将其拖到UITableView上,这意味着我有两个UITableViewCell彼此重叠

唯一可行的方法是以编程方式创建图像视图和进度视图,而不是将UITableViewCell子类化,但我不想这样做。这是我的密码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ResponseTableViewCell *cell = (ResponseTableViewCell*)
    [tableView dequeueReusableCellWithIdentifier:@"ResponseCell"];

    if(indexPath.row == 0) {//display the main image

        cell.responseView.image = _image;
        [cell.progressView setHidden:YES];
        return cell;
    }
      //display responses to the image
      indexPath = [NSIndexPath indexPathForRow:indexPath.row-1 inSection:indexPath.section];
       Photo *response = [ self getResponseAtIndex:indexPath.row];
       NSMutableDictionary* downloadInfo = [self getConnectionInfoForId:[response photoId]];
       if([response fullImage] == nil) {
           float received = [[downloadInfo objectForKey:@"receivedBytes"] floatValue];
           float total = [[downloadInfo objectForKey:@"totalFileSize"] floatValue];

           NSNumber* percentage= [NSNumber numberWithFloat:received/total];
           NSMutableDictionary* userInfo = [[NSMutableDictionary alloc] init];
           [userInfo setObject:cell.progressView forKey:@"cell"];  
           [userInfo setObject:percentage forKey:@"percentage"];  /

           [self performSelectorOnMainThread:@selector(updateProgressView:) withObject:userInfo waitUntilDone:NO
];
           return cell;
        }
        else {
           cell.responseView.image = response.fullImage;
            return cell;
        }
}

我怀疑这可能与您发布的代码之外的内容有关。但另一个问题是

        [cell.progressView setHidden:YES];

因为我看到您稍后在主线程上仔细地更新了progressvView,但没有在主线程上执行
setHidden
。这是一个UIProgressView,用户界面代码应该在主线程上,甚至可以是像
setHidden
这样的小程序。

emrys57,是的,你是对的。在主线程中完成所有UI更新后,我能够隐藏和显示我的进度视图。但我仍然有一个问题:虽然我的进度视图的“进度”值已更改,但视图没有相应地更新。我不明白为什么,因为我现在正在主线程上进行所有更新。也许我还遗漏了什么。谢谢。当进度指示器在主线程上被正确更改时,它没有更新的通常原因似乎是主线程从来没有机会运行。它是否正在阻塞,等待此线程?您可以尝试在
performSelectorOnMainThread
调用中指定
waitUntilDone:YES
。它可能会起作用,但我也能理解为什么它会失败得可怕,所以,祝你好运!