Zamiast używać NSFetchedResultsController jako źródła danych widoku tabeli, utwórz NSArray, który ustawisz, gdy użytkownik zmieni kolejność sortowania za pomocą segmentowanej kontroli, bazując na zawartości tablicy na pobranych wynikach. Następnie posortuj według standardowego sortowania macierzy. Coś takiego:
- (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];
}
Więc deskryptor sortowania Użyłem nazywany jest „nazwa”, ale można to zmienić na nazwę pola, które chcesz, aby posortować według pobranego w wynikach. Ponadto elementy, do których się odwołałem, będą Twoimi nowymi źródłami danych widoku tabeli. Delegaci widoku tabeli będą teraz wyglądać mniej więcej tak:
- (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;
}
Nie jestem pewien, czy to najlepszy sposób, ale powinien zadziałać.
Użyłem twojego rozwiązania. Wygląda na to, że nie ma opóźnienia. Ale czy każdy organ wie, czy to zrobi fizyczne pobranie z bazy danych? – user523234
Należy pamiętać, że zmiana instrukcji sortDescriptors na instancji fetchRequest z FRC ma jedną wadę. Podczas używania metody delegatów: kontroler: didChangeObject: atIndexPath: forChangeType: newIndexPath: 'FRC zgłasza obiekt jako" przeniesiony "zamiast" zaktualizowany ", gdy, jak dokumentuje,' zmieniony atrybut obiektu jest jednym z deskryptorów sortowania używanych w pobrać żądanie ". FRC odnotowuje te klawisze tylko w momencie ich utworzenia, więc kiedy później zmienisz sortsekrytoriów na inne keypaty, FRC nie weźmie ich pod uwagę i będzie raportować "aktualizacje" zamiast "ruchów" lub odwrotnie. Lepiej stwórz nowy FRC. – bteapot