iOS应用程序崩溃与iCloud连接

时间:2011-11-01 22:59:26

标签: ios core-data ios5 nsfetchedresultscontroller icloud

我的应用仅使用一个managedObjectContext,并设置为使用iCloud同步coredata更改,并且我使用NSFetchedResultsController来获取UITableView的数据。当我尝试编辑(重新排序)表格单元格时,会出现问题。

想象一下这种情况:

我执行[tableView setEditing:YES animated:YES];
我将手指放在一排,然后开始围绕tableView移动(重新排序)。与此同时,我在mac app中删除了一行,并保存更改。

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)section方法并记录我正在返回的内容。我发现第一次返回3,第二次是2!

编辑:现在我在想......它应该以这种方式运作,还是我必须找到另一种方法来实现它?拖动单元格时应该怎么办,并调用[tableView moveRowAtIndexPath:toIndexPath:]; ?

2 个答案:

答案 0 :(得分:0)

您的崩溃说您启动了-beginUpdates块,删除了一行,然后调用了-endUpdates,但是当tableview向其数据源询问该部分中的行数时,它已被移交预计3时返回2。听起来您没有正确更新数据源。

答案 1 :(得分:0)

即使记录它,也会发生一些事情。我的意思是,它正在破碎所以它显然不能正常工作吗? 一些想法:

  1. 也许您使用的方法返回numberOfRowsInSection 设置不当。
  2. 也许cellForRowAtIndexPath错误地查看了错误的列表。
  3. 您可以在for循环中删除并刷新显示。
  4. 您的错误明确指出它正在尝试在某个时刻在索引2处查找项目。为什么它看起来有没有人猜测没有源代码。我对这些事情有些疑问,最终总是我的错。一个劳动密集但相当简单的方法来解决这个问题,就是把一堆NSLog语句放在一起,以便你可以跟踪什么时候被调用。我猜你是在错误的时间从数组中删除对象。并且很容易犯错误。