2013-08-31 2 views
0

해당 셀에 축소판 이미지를 채우는 UITableView이 있습니다. 제 경우에는 축소판이 서버에서 다운로드됩니다. 다음과 같이 내 코드는 다음과 같습니다UITableViewCell에 축소판 그림 다운로드

if (![self thumbnailExists]) 
{ 
    self.thumbnailImageView.image = nil; 
    [self.activityIndicatorView startAnimating]; 

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock: 
    ^{ 
     NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.thumbnailURL]]; 
     UIImage *image = [UIImage imageWithData:data]; 


     [[NSOperationQueue mainQueue] addOperationWithBlock: 
     ^{ 
      SubmenuScrollViewTableViewCell *submenuScrollViewTableViewCell = (SubmenuScrollViewTableViewCell*)[(UITableView*)self.superview cellForRowAtIndexPath:self.indexPath]; 
      [submenuScrollViewTableViewCell.activityIndicatorView stopAnimating]; 
      submenuScrollViewTableViewCell.thumbnailImageView.image = image; 
     }]; 
    }]; 

    [self.operationQueue addOperation:operation]; 
    [self.operationQueues setObject:operation forKey:[self title]]; 
} 

이 코드는 큰 WWDC2012 프레젠테이션을 기반으로 "iOS에서 동시 사용자 인터페이스를 구축". 프레젠테이션의 코드와 코드의 주요 차이점은 웹에서 검색된 데이터로 셀을 채우는 것입니다.

그것은 대부분 잘 작동하지만 문제는 내가 정말로 빠르게 스크롤하면 셀 중 하나가 틀린 썸네일로 나타날 수 있습니다 (일반적으로 셀이 썸네일이 속한 셀). 이 코드는 layoutSubviews 오버라이드 된 메소드 UITableViewCell에서 실행 중임을 언급해야합니다.

누구든지이 코드의 결함을 발견 할 수 있습니까?

SubmenuScrollViewTableViewCell *submenuScrollViewTableViewCell = (SubmenuScrollViewTableViewCell*)[(UITableView*)self.superview cellForRowAtIndexPath:self.indexPath]; 

당신이 호출 할 때 인덱스 경로에있는 셀을 잡는이 인덱스 경로 경우에 무엇이든 셀에 배치됩니다

+0

이것을 알아 냈습니까? – AdamG

+0

@AdamG - 그래, 아래에서 보았습니다. 도움을 주셔서 감사합니다. –

답변

0

문제는 위 코드가 내가 만든 서브 클래 싱 된 UITableViewCell의 layoutSubviews 메서드에 있다는 사실과 관련이 있습니다. cellForRowAtIndexPath 메서드에서 다시 이동하면 문제가 제거됩니다.

1

코드가 파괴되는 이유는이 코드 줄입니다 셀이 재사용됩니다. 이렇게하면보기가 매우 빠르게 이동하고 서버의 응답이 다른 시간에 들어올 때 다른 셀에 다른 이미지가 표시됩니다.

prepareForReuse에서 작업을 취소하고 셀 이미지를 지워서 이미지가 잘못된 셀에 배치되지 않도록하거나 이미지가 다시 사용되지 않도록하십시오.

또한 일반적으로 셀 자체에서 tableView를 호출하는 것은 바람직하지 않습니다.

+0

답장을 보내 주셔서 감사합니다. 셀이 이미 화면에서 벗어난 경우에는 아무 것도 반환하지 않을 것이라는 생각 때문에 여러 곳에서 권장되는 코드 줄을 보았습니다. 나는 셀 자체에서 tableview를 호출하지 않더라도 당신의 요점을 보았다. 이 문제는 UITableViewCell 대신 UITableView 자체에서 코드를 가져 오는 것이 가능합니까? –

+0

그게 문제 일 수 있다고 생각합니다. 셀이 재사용되고 있기 때문에 self.indexPath에 대한 참조가 non-nil 응답을 가져올 것이라고 생각했습니다. 또한 이것이 세포의 배수 일 가능성이 높은 이유를 설명합니다. 이것이 문제라면 비동기 콜백 전에 블록을 호출하고 저장된 indexPath를 사용하여 셀을 가져올 때 블록 오른쪽에 indexPath를 저장하는 것이 해결책 일 수 있습니다. – AdamG

+0

여러 셀에 하나의 이미지가 없도록 cellForRowAtIndexPath에서 셀을 제거한 후에 이미지 뷰의 이미지 속성을 nil로 설정해보십시오. – hacker2007

관련 문제