2012-11-28 3 views
2

이미지를 비동기 적으로 다운로드하여 UITableView에 표시하고 있습니다. 이미지가 다운로드되는 동안 해당 테이블 행에 UIProgressView가 표시되어야합니다. 다운로드가 완료되면 진행보기가 실제 이미지로 바뀝니다.UITableViewCell UIImageView 또는 UIProgressView 표시

스토리 보드를 사용 중이고 UITableViewCell을 UIImageView responseView 용 IBOutlets 및 UIProgressView (progressView)가있는 ResponseTableViewCell 클래스에 하위 클래스로 만들었습니다. 어떤 이유로 다운로드가 완료된 후 진행보기를 숨길 수 없습니다. 숨기지 않으면 다운로드 한 이미지 위에 나타납니다. 숨기려고하면 모든 행에 숨겨집니다. 나는 이것이 세포 재사용과 관련이 있다고 생각한다.

또한 두 개의 사용자 지정 셀을 만들려고했습니다. 하나는 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; 
     } 
} 

답변

0

: 여기 내 코드입니다. 난 당신이주의 깊게 나중에 메인 스레드에서 progressvView를 업데이트 한 것으로 볼 수 있지만, 메인 스레드에서 setHidden을 실행하지 않기 때문에 그러나 다른 문제는

 [cell.progressView setHidden:YES]; 

입니다. 그것은 UIProgressView이고, UI 코드는 메인 스레드에 있고, 어쩌면 setHidden만큼 작은 것으로 간주됩니다.

+0

emrys57, 네 말이 맞습니다. 주 스레드에서 모든 UI 업데이트를 수행 한 후 내 진행 상황을 숨기고 표시 할 수 있습니다. 하지만 여전히 한 가지 문제가 있습니다. 진행률보기의 "진행률"값이 변경되었지만보기가 그에 따라 업데이트되지 않습니다. 나는 왜 지금은 메인 스레드에서 모든 업데이 트를하고 있는지 알 수 없습니다. 어쩌면 내가 놓친 다른 것이있을 수 있습니다. 감사. – ganime

+0

주 스레드에서 올바르게 변경되었을 때 진행 표시기가 업데이트되지 않는 일반적인 이유는 주 스레드가 절대로 실행할 기회가없는 것 같습니다. 차단하고 있습니까,이 스레드를 기다리고 있습니까? 'performSelectorOnMainThread' 호출에서'waitUntilDone : YES'를 지정할 수 있습니다. 그것은 효과가 있을지 모르지만, 나는 또한 그것이 끔찍하게 실패 할 수있는 이유를 볼 수 있습니다. 그래서 행운을 빈다. – emrys57

관련 문제