使用NSFetchedResultsController时,UITableView不会在模型更改时重新加载

时间:2013-05-23 12:32:07

标签: uitableview reloaddata delete-row nsfetchedresultscontroller

从表视图中逻辑删除对象时出现问题。想法是如果不应该显示项目,则将标记设置为“已删除”等项目。加载数据谓词不应加载此类行。

包含谓词和创建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]的显式调用不会重新加载数据和项目。

我几乎没有想法如何重新加载数据。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我不应该在DB“已删除”中命名一个字段。重命名它,现在app工作正常。