我有一个UITableView,它使用从nib加载的自定义单元格,并连接到控制器(使用initWithNibName:bundle :)。基本上,我注意到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
请注意,事件'Atlantic Bay'在表格中首先出现,然后在表格中出现。向上滚动时,它不再显示为表格中的第一个条目!
答案 0 :(得分:2)
要继续使用viggio24,我同意我没有看到您正确重新配置该单元格的位置。当你离开时...你会得到一个已经有“东西”的单元格。重置所有可见的东西是你的工作。
您还应该仔细阅读Loading Custom Table-View Cells From Nib Files。通常,您使用-loadNibNamed:owner:options:
代替-initWithNibName:bundle:
。