Вместо использования NSFetchedResultsController в качестве источника данных табличного представления создайте NSArray, который вы устанавливаете, когда пользователь меняет порядок сортировки, с помощью сегментированного элемента управления, основывая содержимое массива на полученных результатах. Тогда просто сортируйте, используя стандартную сортировку массива. Примерно так:
- (IBAction)segmentChanged:(id)sender
{
// Determine which segment is selected and then set this
// variable accordingly
BOOL ascending = ([sender selectedSegmentIndex] == 0);
NSArray *allObjects = [fetchedResultsController fetchedObjects];
NSSortDescriptor *sortNameDescriptor =
[[[NSSortDescriptor alloc] initWithKey:@"name"
ascending:ascending] autorelease];
NSArray *sortDescriptors = [[[NSArray alloc]
initWithObjects:sortNameDescriptor, nil] autorelease];
// items is a synthesized ivar that we use as the table view
// data source.
[self setItems:[allObjects sortedArrayUsingDescriptors:sortDescriptors]];
// Tell the tableview to reload.
[itemsTableView reloadData];
}
Таким образом, дескриптор сортировки, который я использовал, называется «имя», но вы должны изменить его на имя поля, по которому вы хотите сортировать в полученных результатах. Кроме того, элементы ivar, на которые я ссылался, будут вашим новым источником данных табличного представления. Ваши делегаты представления таблицы теперь будут выглядеть примерно так:
- (NSInteger)tableView:(UITableView*)tableView
numberOfRowsInSection:(NSInteger)section
{
return [items count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Get your table cell by reuse identifier as usual and then grab one of
// your records based on the index path
// ...
MyManagedObject *object = [items objectAtIndex:[indexPath row]];
// Set your cell label text or whatever you want
// with one of the managed object's fields.
// ...
return cell;
}
Не уверен, что это лучший способ, но он должен работать.