Мое приложение имеет 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;
}
}