2012-08-05 18 views
5

Estoy ordenando los resultados de una solicitud de recuperación con un descriptor de clasificación.¿Cómo ordenar cadenas no inglesas usando nspredicate?

NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:[MyEntity entityName]]; 
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"property" 
                  ascending:YES 
                  selector:@selector(localizedCompare:)]; 
req.sortDescriptors = [NSArray arrayWithObject:descriptor]; 
return [self.managedObjectContext executeFetchRequest:req error:nil]; 

El problema es las palabras, que comienza con caracteres no ingleses como 'I' se enumeran al final de la lista. Es una carta turco y el alfabeto se ve así:

A, B, C, C, D, E, F, G, G, H, I, I, J, K, L, M, N, O, Ö, P, R, S, Ş, T, U, Ü, V, Y, Z.

Así que la carta está en la 12ª posición.

No sé por qué, pero el uso de comparator after traching objects funciona. Por lo tanto, funciona en cualquier matriz pero no con el descriptor de clasificación para la solicitud de búsqueda.

Respuesta

3

Eche un vistazo a los detalles de mi pregunta en NSFetchedResultsController v.s. UILocalizedIndexedCollation Muestro cómo usar UILocalizedIndexedCollation para generar correctamente el alfabeto y ordenarlo usando el método de clasificación correcto basado en UILocalizedIndexCollation. Mi pregunta solo gira en torno a pedir una mejor manera de hacer esto.

Si no utiliza UILocalizedIndexCollation, solo debe utilizar LocalizedStandardCompare: no localisedCompare como se menciona en los videos de WWDC para localización.

1

Trate

[NSSortDescriptor alloc] initWithKey:@"property" ascending:YES selector:@selector(localizedCompare:)] 

EDITAR

@Mert ha actualizado su pregunta. Parece que ahora localizedCompare: ordena las letras turcas correctamente, pero no funciona con la solicitud de búsqueda.

Esto es lo que he hecho para probar este problema. Tal vez se puede comprobar si funciona en su entorno y luego trabajar desde allí:

// Create some entities: 
NSArray *a = @[@"İ", @"J", @"Ğ", @"G", @"H", @"I", @"Ç", @"C"]; 
for (NSString *s in a) { 
    MyEntity *e = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntity" 
               inManagedObjectContext:self.managedObjectContext]; 
    e.name = s; 
} 

// Fetch all entities in sorted order: 
NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:@"MyEntity"]; 
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" 
                  ascending:YES 
                  selector:@selector(localizedCompare:)]; 
req.sortDescriptors = [NSArray arrayWithObject:descriptor]; 
NSArray *result = [self.managedObjectContext executeFetchRequest:req error:nil]; 

"myEntity" es una entidad de datos básicos con un atributo "nombre" de tipo String.

+0

se no funcionó También traté de cambiar el lenguaje del simulador. – Mert

+0

Eso es extraño. Si ordeno una matriz con '[myArray sortedArrayUsingSelector: @selector (localizedCompare :)]' entonces obtengo los resultados correctos. ¿Puedes mostrar el código de cómo configuraste la solicitud de búsqueda? –

+0

He editado mi pregunta y he añadido el código – Mert

0

Yo tenía un problemas similares con:

[strArr sortedArrayUsingSelector:@selector(localizedCompare:)]

Parece que

localizedCompare

llamadas

compare:other options:nil range:NSMakeRange(0, self.length) locale: [NSLocale currentLocale]];

[NSLocale currentLocale] podría estar en un estado mixto según las preferencias de los usuarios.Que para ello es necesario para crear un ambiente limpio NSLocale basado en el lenguaje de los usuarios

intente crear una categoría en NSString con el siguiente contenido:

-(NSComparisonResult)currentLocalCompare:(id)other 
{ 
    NSLocale * currLoc = [NSLocale currentLocale]; //get current locale 
    NSLocale * loc = [[NSLocale alloc] initWithLocaleIdentifier:currLoc.localeIdentifier];//lets create a new clean NSLocale based on users prefared langauge 
    return [self compare:other options:nil range:NSMakeRange(0, self.length) locale:loc];//compare using clean NSLocale 
} 

y llamar así:

[strArr sortedArrayUsingSelector:@selector(currentLocalCompare:)]

Cuestiones relacionadas