Фильтрация представления таблицы с использованием полученного контроллера результатов без панели поиска?

У меня есть UITableView, использующий контроллер NSFetchedResults для заполнения таблицы следующим образом:

- (NSFetchedResultsController *)fetchedResultsController {

    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Expense" inManagedObjectContext:self.managedObjectContext];

    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"expenseDate" ascending:NO];

    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

    [fetchRequest setFetchBatchSize:20];

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];

    self.fetchedResultsController = theFetchedResultsController;

    self.fetchedResultsController.delegate = self;

    return _fetchedResultsController;

}

Я хочу иметь возможность фильтровать результаты, но по нескольким причинам я не хочу использовать панель поиска и контроллер отображения поиска.

Могу ли я в любом случае отфильтровать результаты, используя свой собственный предикат, а затем перезагрузить таблицу?


person samturner    schedule 22.03.2014    source источник


Ответы (2)


После получения результатов у вас будет новый массив данных для заполнения через UITableView, затем вы можете вызвать:

[tableView reloadData];
person Gabriel.Massana    schedule 22.03.2014
comment
Конечно, но как мне получить эти новые результаты? Могу ли я просто сделать новый запрос на выборку на контроллере выборки и выполнить его? - person samturner; 23.03.2014

Конечно, вы можете добавить NSPredicate в свой NSFetchRequest, а затем выполнить новую выборку с помощью NSFetchedResultsController.

Вот пример, когда я сделал что-то подобное:

- (NSFetchedResultsController *)fetchedResultsController {

    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Expense" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];
    NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"expenseDate" ascending:NO];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
    [fetchRequest setFetchBatchSize:20];

    //Apply your filtering predicate to the fetchRequest if necessary
    NSPredicate *filterPrediate = [self getFilterPredicate];
    if(filterPrediate){
    [fetchRequest setPredicate:filterPrediate];
    }

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];

    _fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;
    return _fetchedResultsController;

}

- (NSPredicate *)getFilterPredicate
{
    //Get or create your filtering predicate here.
    //You can combine NSPredicates using a NSCompoundPredicate if necessary.
    if(shouldFilter){
        return yourNSPrecicate;
    }else{
        return nil;
    }
}

- (void)reloadFetchedViewController
{
    NSError *error;
    if (![self.fetchedResultsController performFetch:&error]) {
        // Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }
}

Затем, чтобы обновить UITableView новым запросом:

self.fetchedResultsController = nil;
[self reloadFetchedViewController];
[self.tableView reloadData];
person Jpoliachik    schedule 16.05.2014
comment
Еще одно дополнительное замечание: никогда не используйте self.fetchedResultsController в его собственном методе инстанцирования. Вместо этого используйте _fetchedResultsController - person Jpoliachik; 16.05.2014