2013-11-29 3 views
1

У меня есть UITableView, используя NSFetchedResultsController, чтобы отобразить список пользователей. Я добавил UISegmentedControl, чтобы переключаться между моим полным списком пользователей и только моими активными пользователями.Фильтрация UITableView из NSFetchedResultsController и основные данные с NSPredicate

Чтобы получить свой список пользователей, я использую 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; 
} 

Чтобы выполнить обновление Tableview при нажатии на UISegmentedControl, я использую segmentedControlIndexChanged:

-(IBAction) segmentedControlIndexChanged{ 
    self.fetchedResultsController = nil; 
    [self fetchedResultsController]; 
    [self.tableView reloadData]; 
} 

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

Я также хотел узнать, можно ли отфильтровать список с помощью анимации? Точно так же, как в iPhone Phone App, когда на вкладке «Реценты» он переключается со всех вызовов на пропущенные вызовы?

Благодарим за помощь.

+0

Что-то не работает? Как вы в настоящее время обрабатываете методы делегатов FRC? – Wain

ответ

0

Ваш подход будет работать нормально. Я тоже использую то же самое без каких-либо проблем.

Coming анимации вы можете сделать их в своих методов делегата,

Проверить Apple's Documentation здесь.

0

self.fetchedResultsController = nil; - разумный способ аннулировать собственность.

Но вы должны удалить это странное [self fetchedResultsController]; линия.

[self.tableView reloadData]; будет вызывать делегат, который должен получить доступ к fetchedResultsController собственности (если вы используете _fetchedResultsController переменные в своих методах DataSource, который был бы анти-модель).

фильтр список с анимацией

Подготовьте список строк, чтобы скрыть и отправить

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

вместо reloadData.

Смежные вопросы