0

NSFetchedResultsControllerに添付されたを使用するアプリケーションがありますUITableView

テーブルの下部に表示されるはずの新しいアイテムでデータベースに挿入が行われると、最後のアイテムのセルが新しく挿入されたアイテムに置き換えられるという非常に奇妙な問題が発生しています。挿入したばかりのアイテムが表示されますが、その直前のアイテムは失われています。それ以降の挿入は同じ動作を示し、テーブルは拡大せず、最後のアイテムが新しいアイテムに置き換えられます。

アプリを再起動すると、データの完全なテーブルが正常に表示されます (つまり、上書きされたセルにはデータベース内のデータが残っています)。フェッチされた結果のコントローラーが、新しいアイテムがどこに行くべきかを見失っているようです。

前後の例:

前

後

添加:

の既存のコードcontroller:didChangeObject:atIndexPath:forChangeType:newIndexPath:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
    UITableView *fetchTableView = [self tableViewForFetchedResultsController:controller];
    switch(type) {
        case NSFetchedResultsChangeInsert:
            [fetchTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
               break;
///....
    }
4

2 に答える 2

0

この現象は、問題のある更新コードで、最後のセルを挿入するのではなく、最後のセルを更新していることを示しているようです。


insertRowsAtIndexPaths:withRowAnimation:ではなく使用
reloadRowsAtIndexPaths:withRowAnimation:

于 2013-02-09T11:09:39.277 に答える
0

メソッドで間違ったパラメーターを使用していると思います:

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

行を挿入するときは、newIndexPathではなく、パラメーターを使用するように注意してください。indexPath

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
    switch (type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
        default:
            break;
    }
}
于 2013-02-09T11:12:36.063 に答える