Recherche / Filtrage d'un tableau de classs personnalisées avec NSPredicate

J'ai un tableau qui contient des objects d'une class personnalisée, et je voudrais filterr le tableau basé sur si un des attributes de classs contient une string personnalisée. J'ai une méthode qui est passé l'atsortingbut que je veux être recherché (colonne) et la string qu'il cherchera (searchSsortingng). Voici le code que j'ai:

NSPredicate *query = [NSPredicate predicateWithFormat:@"%K contains %K", column, searchSsortingng]; NSMutableArray *temp = [displayProviders mutableCopy]; [displayProviders release]; displayProviders = [[temp filteredArrayUsingPredicate:query] mutableCopy]; [temp release]; 

Cependant, il lance toujours une exception sur displayProviders = [[temp filteredArrayUsingPredicate: query] mutableCopy]; dire que cette class n'est pas compatible avec le encoding de valeur key pour la key [quelle que soit la string searchSsortingng].

Des idées de ce que je fais mal?

 [NSPredicate predicateWithFormat:@"%@ contains %@", column, searchSsortingng]; 

Lorsque vous utilisez la substitution %@ dans une string de format de prédicat, l'expression résultante sera une valeur constante . Il semble que vous ne voulez pas une valeur constante; vous voulez plutôt que le nom d'un atsortingbut soit interprété comme un path key.

En d'autres termes, si vous faites ceci:

 NSSsortingng *column = @"name"; NSSsortingng *searchSsortingng = @"Dave"; NSPredicate *p = [NSPredicate predicateWithFormat:@"%@ contains %@", column, searchSsortingng]; 

Cela va être l'équivalent de:

 p = [NSPredicate predicateWithFormat:@"'name' contains 'Dave'"]; 

Ce qui est le même que:

 BOOL contains = [@"name rangeOfSsortingng:@"Dave"].location != NSNotFound; // "contains" will ALWAYS be false // since the ssortingng "name" does not contain "Dave" 

Ce n'est clairement pas ce que vous voulez. Vous voulez l'équivalent de ceci:

 p = [NSPredicate predicateWithFormat:@"name contains 'Dave'"]; 

Pour get ceci, vous ne pouvez pas utiliser %@ comme spécificateur de format. Vous devez utiliser %K place. %K est un spécificateur unique aux strings de format de prédicat, et cela signifie que la string substituée doit être interprétée comme un path key (c'est-à-dire le nom d'une propriété), et non comme une string littérale.

Donc, votre code devrait plutôt être:

 NSPredicate *query = [NSPredicate predicateWithFormat:@"%K contains %@", column, searchSsortingng]; 

L'utilisation de @"%K contains %K" ne fonctionne pas non plus, car c'est la même chose que:

 [NSPredicate predicateWithFormat:@"name contains Dave"] 

Ce qui est le même que:

 BOOL contains = [[object name] rangeOfSsortingng:[object Dave]].location != NSNotFound; 

Remplacez %K par %@ dans votre string de prédicats,

 @"%@ contains %@", column, searchSsortingng 

Cela fonctionne pour moi

 [self.array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name contains 'Dave'"]];