2013-10-10 3 views
2

У меня есть простое приложение, где у меня есть страны, у которых есть города, которые, в свою очередь, имеют людей. Я хочу отобразить список стран в виде таблицы. Я использую NSFetchedResultsController для получения всех данных. Это установка:NSFetchedResultsController метод делегирования вызовов при изменении предикатов

-(void)initializeFetchedResultsController 
{ 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Country"]; 
    fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]; 
    fetchRequest.fetchBatchSize = 30; 
    self.fetchResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                     managedObjectContext:[NSManagedObjectContext managedObjectContext] 
                     sectionNameKeyPath:@"nameFirstLetter" 
                       cacheName:nil]; 
    self.fetchResultsController.delegate = self; 
    [self.fetchResultsController performFetch:nil]; 
} 

Я также добавил возможность поиска, введя название страны в строке поиска, поэтому я реализовал метод UISearchBarDelegate:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    if([searchText isEqualToString:@""]) 
    { 
     self.fetchResultsController.fetchRequest.predicate = nil; 
    } 
    else 
    { 
     self.fetchResultsController.fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH[cd] %@", searchText]; 
    } 

    [self.fetchResultsController performFetch:nil]; 
    [self.tableView reloadData]; 
} 

Это работает, но не так, как я хотеть. Я ожидал, что при изменении предикатов мои методы-делегаты NSFetchResultsControllerDelegate будут вызваны снова, чтобы я мог вставлять или удалять элементы/разделы из моего представления таблицы (я хочу анимацию), не задумываясь о том, что было добавлено и удалено. Но это не так, вместо этого, если я изменяю предикат, методы делегирования не вызывают, и я должен сделать простую [self.tableView reloadData]. Я делаю что-то неправильно или это так, как должно работать, и я не могу воспользоваться этим ярлыком?

+0

Сравните http://stackoverflow.com/questions/14797224/uisearchdisplaycontroller-animate-reloaddata для аналогичного вопроса и некоторых идей. –

ответ

3

Как @ StianHøiland говорит, вам нужно сделать это самостоятельно. Как правило, с помощью методов делегатов они вызываются в результате «автономного»/асинхронного изменения, чтобы уведомить вас. Они не вызываются в результате изменения, которое вы явно запросили.

Вы можете подумать об использовании fetchedObjects и функций indexPathForObject: FRC. Отфильтруйте список fetchedObjects (используя ваш предикат). Получите указательные пути для объектов, которые были удалены, и вы можете их анимировать.

4

Вы не ошибаетесь. Так оно и есть, и нет ярлыка. Вам нужно будет реализовать свой собственный код, чтобы оживить представление таблицы между выборками.

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