서브 클래스가 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;
}
그래서 여기 내가 무슨 생각을하는지 .. 내 UIView 하위 클래스를 Initing. 내 속성을 추가하고 있습니다. 그것을 캐시에 두는 것. 그런 다음 내 셀에 추가하십시오. 그런 다음 나중에 캐시에서 가져와 다시 셀에 넣습니다. 그것은 슈퍼 뷰에서만 삭제되었습니다. 그것은 nil'd 아니에요. 왜 문제가됩니까? – Andrew
모든 셀은 고유합니다. contentView는 셀에 고유 한 UIView입니다. 섹션/행에 대한 셀을 얻을 때마다 고유합니다. 너는 단지 그 견해를 엉망으로 만들 수는 없다. MVC의 "보기"를 정보 인 "모델"과 혼동하고 있습니다. 세포 재활용에 대한 전체적인 생각은 각 세포가 새롭게 창조되었거나 이미 사용 된 관점을 가지고 있다는 것입니다. 뷰에 필요한 개체/값을 필요한 데이터로 설정해야합니다. GUI 요소를 캐시하는 것을 잊어 버리고 DATA 캐싱을 생각해보십시오. –
그래서 대신 모든 데이터 조각을 가진 NSObject 하위 클래스를 속성으로 만든 다음 사용자 정의 contentview에 속성으로 추가 할 수 있습니까? – Andrew