2012-10-05 2 views
2

Я получаю эту ошибку в моей консоли, когда мой iPhone приложение падает:UITableView CoreData Assertion Отказ

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-2372/UITableView.m:1070

Он выходит из строя и дать мне это при достижении этой строки кода:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    [tableView endUpdates]; 
} 

Немного о моем приложении и о том, как я к этому пришел. У меня есть контроллер представления с табличным представлением, в котором отображаются мои основные объекты данных. У меня есть эта настройка представления для отображения данных из двух сущностей, поэтому в таблице 1 показаны объекты из объекта, затем в разделе 2 показаны объекты из моего второго объекта.

Здесь начинается моя проблема. Хотя это получилось достаточно хорошо, я могу нажать мой следующий контроллер представлений и добавить объекты к своей первой сущности и сразу вернуться к моему контроллеру tableview без проблем. Однако, если я попытаюсь добавить объект ко второму объекту, вернувшись к моему контроллеру tableview, он сработает, как я описал выше.

Я не могу вообще разобраться, что вызывает это, и поэтому я не уверен, с чего начать. Если у вас есть какие-либо идеи, я рад опубликовать свой код, чтобы помочь вам справиться с этим.

Спасибо.

Некоторая дополнительная информация об ошибке из консоли:

"CoreData: ошибка:. Серьезная ошибка приложения Исключения заразилось от делегата NSFetchedResultsController во время разговора -controllerDidChangeContent :. Invalid обновление: неверное число строк в разделе 0. Количество строк, содержащихся в существующем разделе после обновления (2), должно быть равно количеству строк, содержащихся в этом разделе, перед обновлением (2) плюс или минус количество строк, вставленных или удаленных из этого секция (1 вставлена, 0 удалена) и плюс или минус количество строк, перемещенных в или из этого раздела (0 перемещено, 0 выведено). с userInfo (null) "

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // Return the number of rows in the section. 
    NSInteger rows; 

    id <NSFetchedResultsSectionInfo> sectionInfoAccounts = [[fetchedResultsControllerAccounts sections] objectAtIndex:0]; 
    id <NSFetchedResultsSectionInfo> sectionInfoCosts = [[fetchedResultsControllerCosts sections] objectAtIndex:0]; 

    if (section == 0) rows = [sectionInfoAccounts numberOfObjects]; 
    else if (section == 1) rows = [sectionInfoCosts numberOfObjects]; 

    return rows; 
} 
+0

Xcode должен был напечатать больше об ошибке утверждения. Отредактируйте сообщение, чтобы включить все, что он напечатал. –

+0

Это буквально все, что я получаю в консоли. –

+0

Удалось получить дополнительную информацию об ошибке. Проверьте мой вопрос. –

ответ

2

Вы используете 2 неправдоподобные результаты контроллеров для представления таблицы: одна FRC для таблицы раздела 0 и один FRC для секции таблицы 1. Я немного предполагаю здесь, но это может быть, что ошибка в

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

Если функция вызывается для второго FRC, часть раздела indexPath/newIndexPath равна 0 (поскольку FRC имеет только одну секцию). Но соответствующая таблица раздел 1.

Поэтому необходимо сопоставить индекс путь FRC на пути индекса при просмотрах таблицы перед вызовом insertRowsAtIndexPaths:..., insertRowsAtIndexPaths:... и т.д.

Например, в случае события вставки:

NSIndexPath *newIndexPath1 = [NSIndexPath indexPathForRow:newIndexPath.row inSection:1]; 
[self.tableView insertItemsAtIndexPaths:@[newIndexPath1]]; 

В противном случае новые объекты второго объекта вставляются в виде строк для первого раздела представления таблицы, что приводит к исключению несогласованности.

+0

Это на самом деле имеет большой смысл, спасибо. Я добавил 'if (controller == fetchedResultsControllerCosts) newIndexPath = [NSIndexPath indexPathForRow: newIndexPath.row inSection: 1];' указанному методу и он останавливает ошибку, которую я вижу. Однако теперь это приводит к ошибке объекта объекта за пределами границ при достижении «Cost * cost = [fetchedResultsControllerCosts objectAtIndexPath: indexPath];» при настройке ячейки. –

+0

Оказывается, мне просто нужно было изменить раздел там, а на этот раз 0. Поскольку объекты находятся в разделе 0 FRC, но 1 таблицы. –

Смежные вопросы