我有一个UITableView使用自定义单元格,从nibs加载,并连接到控制器(使用initWithNibName:bundle :)。基本上,我注意到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 2011-02-08 22:18:40
嗨viggio24 - 请参阅下面Rob的帖子下的评论。 – smtlaissezfaire 2011-02-09 16:45:28