テーブル ビューからオブジェクトを論理的に削除する際に問題が発生しました。アイデアは、アイテムが表示されるべきでない場合、「削除済み」のようなアイテムにフラグを 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] への明示的な呼び出しは、データとアイテムをまだそこにリロードしません。
データをリロードするにはどうすればよいか、ほとんど考えが尽きてしまいました。
前もって感謝します。