Irre ich mich da, wenn ich im Glauben bin, dass ein NSFetchedResultsController die Daten aus der SQLite Datenbank holt, mit einem NSFetchRequest?									
									
									
								NSArray sortieren - Zahlen und Sonderzeichen nach Buchstaben
- 
			
- 
			Ja, Du irrst Dich. Ein NSFetchedResultsController holt die Daten aus dem NSManagedObjectContext.
- 
			Ok, danke Michael. 
 
 Aber die Änderungen im NSManagedObjectContext betreffen doch die Daten in der Datenbank, oder? Und wenn ich etwas am NSFetchedResultsController ändere, ändert sich das auch im NSManagedObjectContext und nach dem Speichern somit auch in der Datenbank, richtig?
- 
			Wenn Du das sections Array nutzt und Dir an Hand dessen ein sortiertes Array erstellen lässt, dann ändert das nichts am NSFetchedResultsController.
 Überhaupt überwacht das Teil nur die Änderungen am ManagedObjectContext.
 
 Wenn Du die Objekte bearbeitest, die sich beispielsweise im Sections Array befinden, dann änderst Du auch die Daten im NSManagedObjectContext.
 Da Du aber nur die Reihenfolge im Array ändern willst, bleibt der ManagedObjectContext davon völlig unbeeindruckt.
 
 Nach wie vor besteht aber weiterhin das Problem, dass sich die Strings nicht Deinen Vorstellungen entsprechend sortieren lassen wollen.
 Damit könnte Dir geholfen sein:
 Alles anzeigenQuellcode- NSArray * words = @[@"Andrea", @"Hilde", @"Berta", @"99", @"2001", @"Nadine", @"3lise", @"Christina", @"Denise", @"Frida", @"@dda", @"#ier"];
- NSArray *theSortedStrings = [words sortedArrayUsingComparator:^(id obj1, id obj2) {
- NSString * inputString = (NSString*)obj1;
- NSString * comparerString = (NSString*)obj2;
- NSUInteger first_character = [inputString characterAtIndex:0];
- NSUInteger compare_start_character = [comparerString characterAtIndex:0];
- // Der erste String startet mit einer Zahl, der Zweite nicht.
- if(first_character < 'A' && compare_start_character > 'A') {
- return NSOrderedDescending;
- }
- // Der zweite String startet mit einer Zahl, der erste nicht.
- else if(first_character > 'A' && compare_start_character < 'A') {
- return NSOrderedAscending;
- }
- // Beides Zahlen oder beides Text. Das kann das System intern auch selbst regeln.
- else {
- return [inputString compare:comparerString options:NSCaseInsensitiveSearch|NSNumericSearch];
- }
- }];
- NSLog(@"Sorted: %@", theSortedStrings);
 
 Sorted: (
 Andrea,
 Berta,
 Christina,
 Denise,
 Frida,
 Hilde,
 Nadine,
 "#ier",
 3lise,
 99,
 2001,
 "@dda"
 )«Applejack» "Don't you use your fancy mathematics to muddle the issue!"
 
 Iä-86! Iä-64! Awavauatsh fthagn!
 
 kmr schrieb:Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
 
- 
			Andere Variante von Marco's Ansatz: In dem NSComparisonResult baust Du immer dann einen "sehr grossen" Unichar vor die zu vergleichende Zeichenkette, wenn deren erstes Zeichen keinen Buchstaben darstellt. Dann wird normal verglichen. Somit landen alle Nicht-Buchstaben hinten, ohne dass Du eigene Sortierungen schreiben musst.
 
 Das sieht dann in etwa so aus (ohne Prüfungen etc.):
 Alles anzeigenQuellcode- ... = [tempArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2)
- {
- NSCharacterSet *letters = [NSCharacterSet letterCharacterSet];
- NSString *firstLetter;
- NSString *maxLetter = @"\uFFFF";
- NSString *compareString1 = obj1;
- firstLetter = [obj1 substringToIndex:1];
- if ([firstLetter rangeOfCharacterFromSet:letters].location == NSNotFound)
- {
- // Not a letter, so add a special character to force the entry to the end
- compareString1 = [maxLetter stringByAppendingString:compareString1];
- }
- NSString *compareString2 = obj2;
- firstLetter = [obj2 substringToIndex:1];
- if ([firstLetter rangeOfCharacterFromSet:letters].location == NSNotFound)
- {
- // Not a letter, so add a special character to force the entry to the end
- compareString2 = [maxLetter stringByAppendingString:compareString2];
- }
- return [compareString1 localizedCaseInsensitiveCompare:compareString2];
- }]];
 
 
 HTH, MattesDiese Seite bleibt aus technischen Gründen unbedruckt.