0

テーブル ビューからオブジェクトを論理的に削除する際に問題が発生しました。アイデアは、アイテムが表示されるべきでない場合、「削除済み」のようなアイテムにフラグを 1 に設定することです。データ述語をロードしても、そのような行はロードされません。

NSFetchedResultController の述語と作成を含むコード:

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Photo"];
                request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"section" ascending:YES],
                                            [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES]];
                request.predicate = [NSPredicate predicateWithFormat:@"tag = %@ and deleted == %@", self.tag, @(0)];

                self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                                    managedObjectContext:self.tag.managedObjectContext
                                                                                      sectionNameKeyPath:nil
                                                                                               cacheName:nil];

削除はスワイプで行われます。スワイプのアクションは次のとおりです。

- (IBAction)deletePhoto:(UISwipeGestureRecognizer *)sender {
    CGPoint location = [sender locationInView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];
    if (indexPath) {
        Photo *photo = [self.fetchedResultsController objectAtIndexPath:indexPath];
        [self.tag.managedObjectContext performBlock:^{
            photo.deleted = @(1); //This must trigger data change and view must be redrawn. But it's not happending for some reason.
         }];
    }
}

ここでの問題は、アプリケーションの再起動後にのみ行が削除されることです。何らかの理由で、FetchedResultsController はデータから変更された値を削除せず、テーブル ビューにはまだ行が表示されます。

テーブルビューからアイテムを明示的に削除しようとしましたが、セクション0のアイテム数が正しくないという例外が発生しました(そのため、行がまだフェッチ結果にあると想定しています)。[self.tableView reloadData] または [self performFetch] への明示的な呼び出しは、データとアイテムをまだそこにリロードしません。

データをリロードするにはどうすればよいか、ほとんど考えが尽きてしまいました。

前もって感謝します。

4

1 に答える 1