0

私には理解できない奇妙な問題があります。私は、SQLite ストアからオブジェクトをフェッチするというUIViewControllerかなり典型的なものを持っています。典型的なボイラープレートで、フェッチは正常に機能し、テーブルは正常に機能します。UITableViewNSFetchedResultsControllerNSFetchedResultsController

-(void)controllerWillChangeContent:(NSFetchedResultsController *)controller{

    [self.tableView beginUpdates];
}
-(void)controller:(NSFetchedResultsController *)controller didChangeSection:(id<NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type{

    if(type==NSFetchedResultsChangeInsert){
        [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
    } else if(type==NSFetchedResultsChangeDelete){
        [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
    }

}
-(void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath{

    UITableView *tV = self.tableView;
    if(type==NSFetchedResultsChangeInsert){
        [tV insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
    } else if(type==NSFetchedResultsChangeDelete){
        [tV deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    } else if(type==NSFetchedResultsChangeUpdate){
        [self configureCell:[tV cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
    } else if(type==NSFetchedResultsChangeMove){
        [tV deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [tV insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
    }

}
-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller{
    [self.tableView endUpdates];
}

私が抱えている問題は、リレーションシップが nil であるオブジェクト (リレーションシップ プロパティが述語またはソート記述子のフェッチ要求に関与していない場合でも) は、いつでもフェッチされた結果から消える (controller:didChangeObject:で呼び出されるNSFetchedResultsChangeDelete) ことです。なんらかの方法で更新されます (たとえば、無関係なプロパティの変更)。フェッチを再実行すると、オブジェクトが返されます。

これは、フェッチ リクエストで述語を使用しない場合でも発生します。

ここで何が起こっているのか誰にも分かりませんか?

4

1 に答える 1

0

NSFetchedResultsController の sectionNameKeyPath を変更することで、この問題を修正できました。sectionNameKeyPath プロパティがオプションの関係プロパティである場合は、削除するか変更してみてください。

実際にそのプロパティを使用してセクションを分離したい場合は、「ダミー」オブジェクトを使用して nil を表す必要がある場合があります。(つまり、セクションで使用する場合、プロパティをオプションにすることはできません。)

于 2013-05-10T00:02:00.487 に答える