1

我的应用程序只使用一个managedObjectContext,并设置为与 iCloud 同步 coredata 更改,我使用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)section 方法中并记录我返回的内容。发现第一次返回3,第二次返回2!

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

4

2 回答 2

0

即使记录下来,也会发生一些事情。我的意思是,它坏了,所以它显然不能正常工作,对吧?一些想法:

  1. 也许您用来返回 numberOfRowsInSection 的方法设置不正确。
  2. 也许 cellForRowAtIndexPath 错误地查看了错误的列表。
  3. 您可以在 for 循环中删除和刷新显示。

您的错误明确指出它正在尝试在索引 2.. 处查找项目。为什么它看起来没有源代码有人猜测。我在这些事情上遇到了一些问题,最终总是我的错。解决这个问题的一种劳动密集型但非常简单的方法是放置大量 NSLog 语句,以便您可以跟踪什么时候调用 get 。我猜你是在不正确的时间从数组中删除对象。而且很容易犯错误。

于 2011-11-03T23:16:44.713 回答
0

您的崩溃说您启动了一个-beginUpdates块,删除了一行,然后调用了 ,但是当 tableview 向其数据源询问该部分中的行数时,它在预期的时候-endUpdates被交还了。听起来您没有正确更新数据源。32

于 2011-11-01T23:30:20.430 回答