2012-07-19 2 views
1

서브 클래스가 UITableViewCell이고 읽기 전용 cell.contentView 대신 entryView라는 속성이 있습니다. 나는 테이블 뷰를 올바르게 사용하고 있다고 생각했다. 셀이 모든 엔트리에 대해 재사용된다는 것을 기억하고 매번 모든 것이 추가되어야한다. 그러나 때때로 스크롤 할 때 entryView는 셀에서 사라집니다. 셀은 여전히있을 수 있지만 entryView는 superview에서 제거 된 것처럼 보입니다. 여기에 내 cellForRowAtIndexPath가 있습니다 :UITableViewCell의 Subview가 사라지는 경우가 있습니다.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    JTimelineCell *cell = (JTimelineCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[JTimelineCell alloc] initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:CellIdentifier]; 

    } 

    JTimelineCellContentView *contentView; 

    Entry *entry = [_fetchedResultsController objectAtIndexPath:indexPath]; 

    if ([self.cellContentCache objectForKey:entry.entryID]) { 
     contentView = [self.cellContentCache objectForKey:entry.entryID]; 

     contentView.frame = cell.bounds; 
     [contentView setNeedsDisplay]; 
    } 
    else { 

     contentView = [[JTimelineCellContentView alloc] initWithFrame:cell.bounds]; 


     [self.cellContentCache setObject:contentView forKey:entry.entryID]; 

     contentView.time = [NSDate timeStringForTime:entry.creationDate]; 

     contentView.message = entry.message; 

     [cell setNeedsDisplay]; 
} 

    [cell.entryView removeFromSuperview]; 
    cell.entryView = contentView; 

    [cell addSubview:cell.entryView]; 

    return cell; 
} 

답변

2

나는 당신이 다른 질문에서 유사한 글을 올렸다고 믿습니다. 셀의 contentView는 캐시 할 수 없습니다. 이미지, 문자열, 숫자, 값 등을 캐싱 할 수 있지만 결국에는 셀을 가져올 때 해당 값을 표시 할 요소를 검색 한 다음 해당 값을 설정해야합니다. 따라서 이미지, 문자열, CGRect 등을 캐싱 할 수 있습니다. 그리고 셀을 채우라고 요청하면 캐시를 볼 수 있고 유효하면 캐시 한 값을 가져옵니다. 캐시가 설정되지 않은 경우 처음부터 캐시를 만들어야합니다.

특정 섹션/행의 셀을 가져올 때마다 다릅니다. 그 안에 오래된 값이 있거나 새로운 것일 수 있습니다. 각 항목에 대해 각 GUI 요소를 설정해야합니다. 이러한 요소를 쉽게 찾을 수있는 한 가지 방법은 각각 고유 한 태그를 제공하므로 [cell.contentView viewForTag : xxx]를 사용하여 항목을 가져온 다음 설정할 수 있습니다.

+0

그래서 여기 내가 무슨 생각을하는지 .. 내 UIView 하위 클래스를 Initing. 내 속성을 추가하고 있습니다. 그것을 캐시에 두는 것. 그런 다음 내 셀에 추가하십시오. 그런 다음 나중에 캐시에서 가져와 다시 셀에 넣습니다. 그것은 슈퍼 뷰에서만 삭제되었습니다. 그것은 nil'd 아니에요. 왜 문제가됩니까? – Andrew

+1

모든 셀은 고유합니다. contentView는 셀에 고유 한 UIView입니다. 섹션/행에 대한 셀을 얻을 때마다 고유합니다. 너는 단지 그 견해를 엉망으로 만들 수는 없다. MVC의 "보기"를 정보 인 "모델"과 혼동하고 있습니다. 세포 재활용에 대한 전체적인 생각은 각 세포가 새롭게 창조되었거나 이미 사용 된 관점을 가지고 있다는 것입니다. 뷰에 필요한 개체/값을 필요한 데이터로 설정해야합니다. GUI 요소를 캐시하는 것을 잊어 버리고 DATA 캐싱을 생각해보십시오. –

+0

그래서 대신 모든 데이터 조각을 가진 NSObject 하위 클래스를 속성으로 만든 다음 사용자 정의 contentview에 속성으로 추가 할 수 있습니까? – Andrew

0

heightForRowAtIndexPath 메서드를 사용 했습니까? 그렇다면 높이를 높이면 문제가 해결됩니다. 제 경우에는 비슷한 수정을 시도하고 있습니다.

관련 문제