これを自分で再現することはできないため、収集したいくつかのエラー ログを参照するだけです。本当にこれを理解することはできません。クラッシュが発生すると、2 つの FetchedResults コントローラーがアクティブになります。1 つは各カテゴリに含まれる項目の数を表示するメイン画面にあり、もう 1 つはドリルダウンしたカテゴリを処理するためのものです。残りのバックトレースでわかっているのは、ドリルダウン ビューにオブジェクトを挿入すると、この問題が常に発生するということだけです。何か案は?メイン画面のセルを更新し、詳細画面にセルを挿入しないことに問題があることを誰かが少なくとも確認できますか?
エラー:
** 興味深い部分は、この問題に関して私が受け取った 5 ~ 10 個のログで、範囲 {0,3} と境界 [0 .. 1] が常に同じであるように思われる点に注意してください **
アプリケーション固有の情報: * キャッチされない例外 \'NSRangeException\' によりアプリを終了します。理由: \'* -[NSArray indexOfObject:inRange:]: 範囲 {0, 3} が境界 [0 .. 1] を超えています\'
Last Exception Backtrace: 0 CoreFoundation 0x35ad988f __exceptionPreprocess + 163
1 libobjc.A.dylib 0x336fd259 objc_exception_throw + 33
2 CoreFoundation 0x35acda09 -[NSArray indexOfObject:inRange:] + 205
3 CoreData 0x32e8e73d -[_NSDefaultSectionInfo indexOfObject:] + 133
4 CoreData 0x32e8f299 -[NSFetchedResultsController indexPathForObject:] + 149
5 CoreData 0x32e956f5 -[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] + 4361
コントローラーの作成:
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:mainContext sectionNameKeyPath:nil cacheName:self.groupID];
NSFetchedResultsController コード:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
switch(type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:[self.tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView endUpdates];
}
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView beginUpdates];
}
セルの構成:
-(void)configureCell:(MessageRow *)cell atIndexPath:(NSIndexPath *)indexPath {
MymanagedObject *myobj = [self.convoController objectAtIndexPath:indexPath];
cell.title = myobj.title
}
私のメイン画面では、すべてが基本的に同じ方法で行われることに注意してください。
case NSFetchedResultsChangeUpdate:
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
break;