dequeueReusableCellWithIdentifier返回错误的单元格

时间:2011-02-08 21:46:50

标签: iphone uitableview

我有一个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'在表格中首先出现,然后在表格中出现。向上滚动时,它不再显示为表格中的第一个条目!

1 个答案:

答案 0 :(得分:2)

要继续使用viggio24,我同意我没有看到您正确重新配置该单元格的位置。当你离开时...你会得到一个已经有“东西”的单元格。重置所有可见的东西是你的工作。

您还应该仔细阅读Loading Custom Table-View Cells From Nib Files。通常,您使用-loadNibNamed:owner:options:代替-initWithNibName:bundle: