2013-03-23 13 views
7

Ho una matrice di oggetti personalizzati. L'aspetto oggetto personalizzato come questoFiltra array in ios controllando più proprietà

@interface User : NSObject 
@property(nonatomic, strong)NSString *user_Id; 
@property(nonatomic, strong)NSString *user_Name; 
@property(nonatomic, strong)NSString *user_UserName; 
@end 

devo filtrare la matrice controllando 2 properties.That è se cerco a allora dovrebbe ottenere l'elenco di utenti filtrati dalla matrice contiene a in user_Name o user_Id .Come posso raggiungere Questo? Per una singola proprietà so [USER_NAME]

NSString *predicateString = @"user_Name MATCHES[c] %@"; 
NSString *matchString = [NSString stringWithFormat: @".*%@.*",searchText]; 
NSPredicate *predicate =[NSPredicate predicateWithFormat:predicateString, matchString]; 
self.searchResults = [userArray filteredArrayUsingPredicate:predicate]; 
+0

cosa sull'utilizzo di due di loro e fusione dei risultati? –

+0

true.but come unire i risultati senza duplicati? –

+0

come user_id sarà comune, passerà in rassegna uno di essi e se user_id non nella matrice lo aggiungerà. –

risposta

3

You can join predicate conditions with OR, come ad esempio:

NSString *predicateString = @"(user_Name MATCHES[c] %@) OR (user_Id MATCHES[c] %@)"; 

alternativa, è possibile filtrare la matrice utilizzando indexesOfObjectsPassingTest: con un blocco di test appropriato e poi objectsAtIndexes: per ottenere un array degli oggetti che superano il test.

+0

Per qualche motivo questo non funziona per me, quindi usato oCompoundQueries e ha funzionato. – user431791

1
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(user_Name== %@) || (user_Id== %@), <name>, <id>]; 
1

tenta di utilizzare questa stringa predicato

NSString *predicateString = @"user_Name MATCHES[c] %@ OR user_Id MATCHES[c] %@";