2013-08-02 15 views
8

Ho una semplice NSPredicate che non sta dando risultato correttoproblema NSPredicate con più di uguale

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF.data.squareFootage >= %@", filterSquareFootage]; 
filteredArray = [[filteredArray filteredArrayUsingPredicate:resultPredicate] mutableCopy]; 

Stranamente questo funziona per tutti 6000> = 250, 7000> = 250, 8000> = 6000. Ma non appena squareFootage == 10000 il predicato per 10000> = qualsiasi valore inferiore è falso. Nota: 10000 per squareFootage è un valore massimo recuperato utilizzando un UISlider.Se si riduce il valore a qualsiasi valore inferiore, il predicato restituisce true come risultato

Mi manca qualcosa qui e utilizzo del predicato in modo errato?

+0

Come stai memorizzando i valori (quale tipo di dati, numero/stringa/...)? – Wain

+0

@Wain - squarefootage è memorizzato come NSString in un modello classe conforme a NSCoding. – rawatm

risposta

22

Presumo che la vostra proprietà è archiviato come stringa e non come numero, quindi i valori vengono confrontati come stringhe:

"10000" < "250" < "6000" 

Uso NSNumber invece di NSString (o in alternativa un certo tipo scalare come NSInteger) dovrebbe risolvere il problema.

Se non è possibile modificare il tipo di dati della proprietà squareFootage, allora la seguente predicato dovrebbe funzionare:

[NSPredicate predicateWithFormat:@"SELF.data.squareFootage.intValue >= %d", [filterSquareFootage intValue]] 
+0

ho cambiato squarefootage e filtersquarefootage in NSNumber con segnaposto in predicato ancora come% @. Ma ora la chiamata a filteredArrayUsingPredicate sta generando un [__NSCFNumber length]: selettore non riconosciuto inviato all'eccezione di istanza. Qualche idea su cosa possa andare storto qui. – rawatm

+0

@ basstrekekr87: Questo potrebbe accadere se uno dei valori di 'squareFootage 'è ancora un NSString e non un NSNumber. –

+0

Grazie mille. ho dimenticato di cancellare vecchi valori. ora funziona. – rawatm

0

PUOI "T confrontare le stringhe UTILIZZO = < se SELF.data.squareFootage è. un NSNumber prova a convertire filterSquareFootage in NSnumber o int value e confrontalo in questo modo

+0

ho convertito sia squareFootage che filterSquareFootage in NSNumber (segnaposto in predicato è% @ per NSNumber) ma ora filterArrayUsingPredicate sta dando una [__NSCFNumber lunghezza]: selettore non riconosciuto inviato all'istanza. – rawatm

+0

utilizza% d anziché% @ – Radu