我的应用仅使用一个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:]; ?答案 0 :(得分:0)
您的崩溃说您启动了-beginUpdates
块,删除了一行,然后调用了-endUpdates
,但是当tableview向其数据源询问该部分中的行数时,它已被移交预计3
时返回2
。听起来您没有正确更新数据源。
答案 1 :(得分:0)
即使记录它,也会发生一些事情。我的意思是,它正在破碎所以它显然不能正常工作吗? 一些想法:
您的错误明确指出它正在尝试在某个时刻在索引2处查找项目。为什么它看起来有没有人猜测没有源代码。我对这些事情有些疑问,最终总是我的错。一个劳动密集但相当简单的方法来解决这个问题,就是把一堆NSLog语句放在一起,以便你可以跟踪什么时候被调用。我猜你是在错误的时间从数组中删除对象。并且很容易犯错误。