사용자 정의 셀을 사용하고 닙에서로드 한 후 initWithNibName : bundle을 사용하여 컨트롤러에 연결하는 UITableView가 있습니다. 기본적으로 dequeueReusableCellWithIdentifier는 이미로드 된 셀을 반환하지만 그렇지 않아야한다는 것을 알았습니다.dequeueReusableCellWithIdentifier가 잘못된 셀을 반환합니다.
- (UITableViewCell *) tableView: (UITableView *) tv cellForRowAtIndexPath: (NSIndexPath *) indexPath {
return [[self controllerForTableView: tv cellForRowAtIndexPath: indexPath] cell];
}
- (TableViewCellBaseController *) controllerForTableView: (UITableView *) tv cellForRowAtIndexPath: (NSIndexPath *) indexPath {
[self checkValidTableView: tv];
UIViewController *controller;
Class class;
Event *event;
int row = [indexPath row];
DLOG(@"at index path row: %i", row);
if (row == [currentEvents count]) {
controller = [self tableCellContainerFromNibName: nibName
tableView: tv
atIndex: row
withClass: class];
} else {
class = [EventFeaturedTableViewCell class]; // TODO: OR class = [EventNonFeaturedTableViewCell class];
event = [self findEventFromIndex: row];
lastSelectedEvent = event;
DLOG(@"event: %@", event);
controller = [self tableCellContainerFromNibName: NSStringFromClass(class)
tableView: tv
atIndex: row
withClass: class
perform: @selector(initTableCellWithController:)
on: self];
}
return controller;
}
- (TableViewCellBaseController *) tableCellContainerFromNibName: (NSString *) nibName
tableView: (UITableView *) tableView
atIndex: (int) index
withClass: (Class) class
perform: (SEL) selector
on: obj {
CustomTableViewCell *cell = (CustomTableViewCell *) [tableView dequeueReusableCellWithIdentifier: nibName];
TableViewCellBaseController *controller;
DLOG(@"Cell: %@", cell);
DLOG(@"Cell Identifier: %@", nibName);
if (cell == nil) {
controller = [[class alloc] initWithNibName: nibName bundle: nil];
if (obj) {
[obj performSelector: selector withObject: controller];
}
// run this after setting data as controller.view eager loads the view
cell = controller.cell = controller.view;
cell.controller = controller;
} else {
controller = cell.controller;
if (obj) {
[obj performSelector: selector withObject: controller];
}
}
return controller;
}
- (void) initTableCellWithController: (EventsIndexTableViewCell *) controller {
controller.event = lastSelectedEvent;
}
사용자 지정 셀 컨트롤러의 뷰 속성뿐만 아니라 '세포'속성을 사용하여 컨트롤러에 IB에 매여되었습니다 여기
내 대리자 메서드입니다. 맞춤형 셀에는 펜촉에 직접 설정된 고유 한 식별자가 있습니다.컨트롤러의 데이터가 올바른지 이미 확인했습니다. 경우 '대서양 베이'표에 나중에 다음 표에 먼저 표시되는지
http://screencast.com/t/NI2Tpc7GKEi
주의 사항 :
는 여기에 내가 시뮬레이터에서보고 있어요 효과입니다. 백업을 스크롤 할 때 더 이상 테이블의 첫 번째 항목으로 표시되지 않습니다!
그러나 컨트롤러의 setEvent : 메소드가 셀 내용을 수정하기 위해 오버라이드 되었습니까? 대답이 아니라면, 당신은 기본적으로 대기열에서 제외 된 셀 구조 (cell.controller)를 변경하지만 내용은 변경하지 않기 때문입니다. 컨트롤러 Nib가로드되고 뷰가 생성되고 컨트롤러의 setEvent를 사용하여 컨트롤러를 명시 적으로 업데이트하지 않으면 셀 구조가 한 번 만들어 졌다고 생각하십시오. 코드 위치에 다른 위치가 표시되지 않습니다. Nibs가 매번 호출되기 때문에 테이블의 첫 번째 셀은 정상입니다. 시스템이 대기열에있는 셀을 다시 시작하기 전까지 발생합니다. – viggio24
안녕하세요 viggio24 - 아래 Rob의 게시물 아래에있는 댓글을 참조하십시오. – smtlaissezfaire