2014-09-03 12 views
11

Sto tentando di creare un NSPredicate con più condizioni. Ho trovato diverse soluzioni, ma nessuna sembra funzionare con il mio metodo. Di seguito, la più bella che ho trovato.NSPredicate con condizioni multiple

Questo è il mio metodo predicato singolo, e funziona bene:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", 
searchText]; 
filteredBusinesses = [businesses filteredArrayUsingPredicate:predicate]; 

Qui è la mia versione modificata con condizioni multiple. Non sono sicuro che cosa sta andando storto. Qualche idea?

+0

Cosa si aspetta e quali sono stai ottenendo? – bhargavg

+0

Mi aspettavo la possibilità di digitare più tipi di informazioni nel mio searchbardelegage. ( – Brandon

+1

incolla il tuo stacktrace – bhargavg

risposta

12

si può provare questo

NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[p1, p2]]; 
+0

inchiodato !!! Grazie mille! – Brandon

+0

... un predicato 'or' non è la stessa cosa di un predicato' e'. –

1

Nulla sembra sbagliato nel codice che hai postato, il che significa che probabilmente l'errore deriva quando si valuta il predicato filtrando l'array.

Poiché il primo predicato funziona, il problema si trova nel percorso chiave businessArea.

Filtraggio matrice sarebbe un'eccezione se:

  1. C'è un oggetto nella matrice che non ha un valore businessArea (come in, non è un oggetto che ha un metodo -businessArea)
  2. l'oggetto ha un valore businessArea, ma il valore non è né un NSStringnil
7

Oltre alla risposta di @ Nikunj, è anche possibile utilizzare NSCompoundPredicate per le operazioni AND in questo modo.

Obj-C - E

NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"X == 1"]; 
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"X == 2"]; 
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[predicate1, predicate2]]; 

Swift - E

let predicate1:NSPredicate = NSPredicate(format: "X == 1") 
let predicate2:NSPredicate = NSPredicate(format: "Y == 2") 
let predicate:NSPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicate1,predicate2]) 

Swift 3 - E

let predicate1 = NSPredicate(format: "X == 1") 
    let predicate2 = NSPredicate(format: "Y == 2") 
    let predicateCompound = NSCompoundPredicate.init(type: .and, subpredicates: [predicate1,predicate2]) 
Problemi correlati