Сбой приложения iOS, связанный с iCloud - PullRequest
1 голос
/ 02 ноября 2011

Мое приложение использует только один managedObjectContext и настроено на синхронизацию изменений coredata с iCloud, и я использую NSFetchedResultsController для извлечения данных для моего UITableView. Проблема возникает, когда я пытаюсь изменить (переупорядочить) ячейки таблицы.

Представьте себе этот сценарий:

Я исполняю [tableView setEditing:YES animated:YES];
Я держу палец на ряду и начинаю перемещать его вокруг tableView (изменить порядок). Тем временем я удаляю строку в приложении Mac и сохраняю изменения.

Приложение iOS узнает о новых изменениях, и мой fetchedResultsController пытается вызвать [tableView beginUpdates] ... и удалить строку из tableView во время ее редактирования.

Я не знаю, должен ли он работать таким образом, но он вылетает.

Как бы вы попытались решить эту проблему?

Вход:

***[3758:707] asynchronously added persistent store!
***[3758:707] numberOfRowsInSection:3
***[3758:707] numberOfRowsInSection:2
***[3758:707] *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-1912.3/UITableView.m:1046
***[3758:707] CoreData: error: Serious application error.  An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.  Invalid update: invalid number of rows in section 0.  The number of rows contained in an existing section after the update (3) must be equal to the number of rows contained in that section before the update (3), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out). with userInfo (null)
***[3758:707] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM insertObject:atIndex:]: index 2 beyond bounds [0 .. 0]'

Первые два журнала находятся в - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) метод раздела и записывают то, что я возвращаю. Я узнал, что в первый раз я вернул 3, а во второй раз это было 2!

РЕДАКТИРОВАТЬ: И теперь я думаю ... это должно работать таким образом, или я должен найти другой способ сделать это? Что должно произойти, когда вы перетаскиваете ячейку и вызываете [tableView moveRowAtIndexPath: toIndexPath:];

Ответы [ 2 ]

0 голосов
/ 04 ноября 2011

Даже при входе в систему что-то происходит.Я имею в виду, он ломается, поэтому он явно не работает правильно, верно?Некоторые идеи:

  1. Возможно, метод, который вы используете для возврата numberOfRowsInSection, настроен неправильно.
  2. Возможно, cellForRowAtIndexPath ошибочно просматривает неправильный список.
  3. Возможно, вы удаляете и обновляете отображение в цикле for.

В вашей ошибке явно указывается, что в какой-то момент она пытается найти элемент по индексу 2 ...Почему это выглядит, никто не догадывается без исходного кода.У меня были некоторые проблемы с этими вещами, и в конце концов, это всегда была моя вина.Трудоемкий, но довольно надежный способ выяснить это состоит в том, чтобы добавить в него кучу операторов NSLog, чтобы вы могли отследить, когда вызывается get.Я предполагаю, что вы удаляете объект из массива в неправильное время.И очень легко ошибиться.

0 голосов
/ 02 ноября 2011

Ваш сбой говорит о том, что вы запустили блок -beginUpdates, удалили строку и затем вызвали -endUpdates, но когда табличное представление запросило у источника данных количество строк в этом разделе, оно было возвращено 3когда это ожидалось 2.Похоже, вы не обновляете свой источник данных должным образом.

...