Ios 使用NSPredicate从NSFetchedResultsController和核心数据筛选UITableView

Ios 使用NSPredicate从NSFetchedResultsController和核心数据筛选UITableView,ios,objective-c,uitableview,nspredicate,nsfetchrequest,Ios,Objective C,Uitableview,Nspredicate,Nsfetchrequest,我有一个UITableView使用NSFetchedResultsController显示用户列表。 我添加了一个UISegmentedControl,以在我的完整用户列表和仅我的活动用户之间切换 要获取用户列表,我使用fetchedResultsController: - (NSFetchedResultsController *)fetchedResultsController { if (_fetchedResultsController != nil) { ret

我有一个
UITableView
使用
NSFetchedResultsController
显示用户列表。 我添加了一个
UISegmentedControl
,以在我的完整用户列表和仅我的活动用户之间切换

要获取用户列表,我使用
fetchedResultsController

- (NSFetchedResultsController *)fetchedResultsController
{
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    [fetchRequest setFetchBatchSize:20];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastname" ascending:YES];
    NSArray *sortDescriptors = @[sortDescriptor];

    [fetchRequest setSortDescriptors:sortDescriptors];

    if (self.barSegmentedControl.selectedSegmentIndex == 1) {
        [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"active == YES"]];
    }

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    NSError *error = nil;
    if (![self.fetchedResultsController performFetch:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _fetchedResultsController;
}
要在单击
UISegmentedControl
时执行tableview的更新,我使用
segmentedControlIndexChanged

-(IBAction) segmentedControlIndexChanged{
    self.fetchedResultsController = nil;
    [self fetchedResultsController];
    [self.tableView reloadData];
}
但我不确定我做得对。 您能告诉我这是否是使用
NSFetchedResultsController
筛选
UITableView
的正确方法吗

我还想知道是否可以用动画过滤列表? 与iPhone手机应用程序中的“最近通话”选项卡完全相同,它可以从所有通话切换到未接来电


谢谢你的帮助。

你的方法会很有效的。我也用同样的东西,没有任何问题

在动画中,您可以使用代理方法执行这些操作


检查此处。

代码>self.fetchedResultsController=nil是使属性无效的合理方法

但是你应该删除这个奇怪的
[self-fetchedResultsController]行。

[self.tableView重载数据]
将调用应该访问
fetchedResultsController
属性的代理(如果在数据源方法中使用
\u fetchedResultsController
变量,这将是一种反模式)

使用动画过滤列表

准备要隐藏和发送的行列表

     [self.tableView deleteRowsAtIndexPaths: ... withRowAnimation:...]

不是
重新加载数据

,是不是有些东西不起作用了?您目前如何处理FRC委托方法?