Ho un array di istanze di una classe denominata Contact
, che ha, tra l'altro, le seguenti proprietà:Utilizzando NSPredicate per la ricerca in array di oggetti
NSArray *mailAddressList // Array of NSString
NSArray *websiteList // Array of NSString
NSArray *tags // Array of instances of Tag class
il tag classe ha le seguenti proprietà:
NSString *name;
UIColor *color;
Desidero utilizzare NSPredicate per cercare una stringa in qualsiasi proprietà di ogni Contact
. Questo è il codice che ho:
if([scope isEqualToString:SCOPE_MAIL] || [scope isEqualToString:SCOPE_WEBSITE])
{
// Search through an array
predicate = [NSPredicate predicateWithFormat:@"ANY SELF.%@ contains[c] %@", scope, textSearch];
}
else if([scope isEqualToString:SCOPE_TAG])
{
// Search another object's property
predicate = [NSPredicate predicateWithFormat:@"SELF.%@.name contains[c] %@", scope, textSearch];
}
else
{
// The rest of the properties are instances of NSString
predicate = [NSPredicate predicateWithFormat:@"SELF.%@ contains[c] %@", scope, textSearch];
}
Tutto funziona benissimo tranne SCOPE_TAG
, non restituisce alcun valore. Non penso di usare correttamente il predicato.
NOTA: Sono nuovo con NSPredicate così mi piacerebbe sentire alcune intuizioni se quello che sto facendo non è ok
non al 100% sicuro se questo è ciò che è responsabile del tuo problema, ma dovresti usare l'identificatore di formato '% K' per i keypaths invece di'% @ '. Ad esempio, la stringa di formato per "SCOPE_TAG" sarebbe "SELF.% K.name contiene [c]% @" '. – indragie
Grazie per il commento. L'ho modificato in% K, ma il comportamento non è cambiato –
Non ti manca l '"ANY" nella tua seconda affermazione di predicato? Penso che tu voglia controllare se qualcuno dei nomi di tag nell'array contiene il testo ... – Alexander