UITableView неправильно отображает ячейку при вставке в первый ряд с анимацией - PullRequest
0 голосов
/ 08 февраля 2012

Мое приложение имеет UITableViewController в качестве корневого контроллера и модальное представление для добавления строки в эту таблицу.Я использую CoreData, поэтому я получаю данные из NSFetchedResultsController.В любом случае, проблема заключается в управлении UITableView.

Каждая вставка заставляет TableView добавлять новую ячейку.Все работает нормально, за исключением случаев, когда ячейка добавлена ​​в первый ряд.В этом случае его содержимое не отображается.Ячейка отображается пустым.Если я нажимаю на ячейку или прокручиваю таблицу так, как ячейка должна быть перезагружена, она показывает ее содержимое.

Я использую анимацию, поэтому я использую [tableView beginUpdates] и [tableView endUpdates], как сказано в документации Apple, вместо [tableView reloadData].Если я делаю [tableView reloadData], все работает нормально.

Я проверил это, и для каждой строки запускается один и тот же код.Это проблема о том, как клетки отображаются.

Я думаю, что проблема заключается в «теории» анимации в TableViews, и вам она, вероятно, не понадобится, но в моем UITableViewController есть соответствующий код:

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
   Customer *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
   cell.textLabel.text = managedObject.name;
}


#pragma mark - Table view data source

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   static NSString *CellIdentifier = @"Cell";

   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
   if (cell == nil) {
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
   }

   [self configureCell:cell atIndexPath:indexPath];

   return cell;
}


#pragma mark - FetchedResultsController delegate


- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView beginUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
   [self.tableView endUpdates];
   // [self.tableView reloadData]; this make all works OK but without animations
}


- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
   atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
  newIndexPath:(NSIndexPath *)newIndexPath {

UITableView *tableView = self.tableView;

switch(type) {

    case NSFetchedResultsChangeInsert:
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;

    case NSFetchedResultsChangeDelete:
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;

    case NSFetchedResultsChangeUpdate:
        [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
        break;

    case NSFetchedResultsChangeMove:
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade];
        break;
}
}

1 Ответ

0 голосов
/ 08 февраля 2012

В своем выражении switch для каждого типа изменений, почему бы не добавить:

[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

Вам придется немного изменить этот код в зависимости от типа изменения, но это избавит от необходимостиbeginUpdates и endUpdates.

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