dequeueReusableCellWithIdentifier возвращает неправильную ячейку - PullRequest
0 голосов
/ 09 февраля 2011

У меня есть UITableView, который использует пользовательские ячейки, загруженные из перьев и подключенные к контроллеру (используя 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 к контроллеру с помощью свойства view контроллера, а также свойства 'cell'. У пользовательских ячеек уникальный идентификатор, установленный непосредственно в кончике.

Я уже проверил, что данные в контроллере верны.

Вот эффект, который я вижу в симуляторе:

http://screencast.com/t/NI2Tpc7GKEi

Обратите внимание, что событие «Атлантическая бухта» появляется сначала в таблице, а затем в таблице. При прокрутке назад она больше не отображается как первая запись в таблице!

1 Ответ

2 голосов
/ 09 февраля 2011

Чтобы продолжить линию viggio24, я согласен, что не вижу места, где вы правильно перенастраиваете камеру. Когда вы удалите ... вы получите ячейку, в которой уже есть "материал". Ваша задача сбросить все видимое.

Вы также должны внимательно прочитать Загрузка пользовательских ячеек табличного представления из файлов пера . Обычно для этого вы используете -loadNibNamed:owner:options:, а не -initWithNibName:bundle:.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...