Reputation: 6975
I have table view managed by fetched results controller. What i want is, to change sort order when user tap segmented control. This is how i create fetched results controller:
- (NSFetchedResultsController *)frc {
if (_frc != nil) {
return _frc;
}
NSString *sortCase;
switch (self.sortOrder) {
case tableSortServer:
sortCase = [NSString stringWithFormat:@"%@", CD_SORT];
break;
case tableSortDate:
sortCase = [NSString stringWithFormat:@"%@", CD_DATE];
break;
default:
sortCase = [NSString stringWithFormat:@"%@", CD_SORT];
break;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:CD_ENTITY_NAME inManagedObjectContext:self.getManagedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc]
initWithKey:sortCase ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
[fetchRequest setFetchBatchSize:BATCH_SIZE];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:self.getManagedObjectContext sectionNameKeyPath:nil
cacheName:@"Root"];
self.frc = theFetchedResultsController;
_frc.delegate = self;
return _frc;
}
In segmented controller callback method i did:
- (IBAction)sortOrderChanged:(id)sender {
UISegmentedControl *sc = sender;
if (sc.selectedSegmentIndex == 0){
self.sortOrder = tableSortServer;
[self.tableView reloadData];
} else {
self.sortOrder = tableSortDate;
[self.tableView reloadData];
}
}
However, its not work. How to achieve that task? (reload table with different sort order)?
Upvotes: 0
Views: 184
Reputation: 21808
Maybe this is because of
if (_frc != nil) {
return _frc;
}
you reload the table. It uses the old fetch results controller. Your self.sortOrder = tableSortServer
is therefore not taken into account. I think you need set new sort descriptor (and actually perform fetch) every time before reloading your table view
Upvotes: 1