2015-06-30 20 views
5

Non riesco a vedere alcun problema con questa riga di codice. Perché non può analizzare?NSPredicate impossibile analizzare la stringa di formato

[NSPredicate predicateWithFormat:@"(username CONTAINS[cd] %[email protected]) || " 
            "(userId CONTAINS[cd] %[email protected]) || " 
            "(firstname CONTAINS[cd] %[email protected]) || " 
            "(lastname CONTAINS[cd] %[email protected])", searchString]" 

Il registro non aiuta neanche.

terminazione app a causa di eccezione non identificata 'NSInvalidArgumentException', la ragione: 'Impossibile analizzare la stringa di formato "(nome utente contiene [CD]% 1 $ @) || (userId CONTIENE [cd]% 1 $ @) || (nome CONTIENE [cd]% 1 $ @) || (cognome CONTIENE [CD]% 1 $ @) "'

Modifica 1:

Va bene, sembra come predicateWithFormat non capisce "% 1 $ @". Lo cambio a

[... predicateWithFormat:[NSString stringWithFormat:...]] // (same format as above) 

Ha superato la linea. Ma, il problema successivo è:

self.filteredUserList = [self.userList filteredArrayUsingPredicate:predicate]; 

terminazione app a causa di eccezione non identificata 'NSUnknownKeyException', motivo: '[valueForUndefinedKey:]: l'utente entità è value non chiave di codifica-compliant per la chiave " un".'

"a" è la parola chiave che ho inserito nel searchTextBox. WUT?

ho stampato il predicato nella console di debug, sembra niente di sbagliato:

username CONTAINS[cd] a OR userId CONTAINS[cd] a OR firstname CONTAINS[cd] a OR lastname CONTAINS[cd] a 

Edit 2:

Ok, problema risolto con questo super codice brutto:

[NSPredicate predicateWithFormat:@"(username CONTAINS[cd] %@) || " 
            "(userId CONTAINS[cd] %@) || " 
            "(firstname CONTAINS[cd] %@) || " 
            "(lastname CONTAINS[cd] %@)", searchString, searchString, searchString, searchString]; 

Cosa succede se voglio espandere il campo di ricerca in futuro? Devo aggiungere altri parametri? altro ", searchString, searchString, searchString"?

risolto

Grazie a Ewan e Bannings, dando 2 opzioni per la mia domanda. Li ho testati entrambi e hanno funzionato a liek con un certo fascino. Qualcuno può spiegare il diverso tra questi due, e in tal caso dovrei usare quale opzione?

** NOTA ** risposta

Bannings' va bene, fino a quando la mia stringa di ricerca contiene un apice singolo ', quindi l'incidente app. Quindi penso che usare quello di Ewan sia meglio.

risposta

7

Si può fare questo:

[[NSPredicate predicateWithFormat:@"(username CONTAINS[cd] $str) || ..."] predicateWithSubstitutionVariables:@{@"str": searchString}]; 
+0

Funziona perfettamente! Questo è quello di cui ho bisogno. Grazie – Eddie

0

è necessario aggiungere la stringa per ogni variabile, se si utilizza il 5% @ è necessario applicare sia lo stesso valore searchString o un altro valore di riempimento per quel% @

[NSPredicate predicateWithFormat:@"(username CONTAINS[cd] %[email protected]) || 
(userId CONTAINS[cd] %[email protected]) || (firstname CONTAINS[cd] %[email protected]) || 
(lastname CONTAINS[cd] %[email protected])", searchString1,searchString2,searchString3,searchString4] 
+0

ho un pò sapere che. C'è un modo per aggirare? Perché tutto il mio SearchString ha lo stesso valore ... – Eddie

+0

http://stackoverflow.com/questions/7536750/nspredicate-with-multiple-comparisons-for-one-query-string Guarda questo ... – eddwinpaz

+0

Non lo so voglio usare il predicato composto, dal momento che il mio predicato non è troppo complesso. – Eddie

3

cambio Da %[email protected]-'%[email protected]':

NSString *formatString = [NSString stringWithFormat:@"(username CONTAINS[cd] '%[email protected]') || (userId CONTAINS[cd] '%[email protected]') || (firstname CONTAINS[cd] '%[email protected]') || (lastname CONTAINS[cd] '%[email protected]')", searchString]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:formatString]; 
+0

Awwwright! Anche questo funziona. Ma ho appena accettato la risposta di Ewan. Mi dispiace. – Eddie

+0

La migliore risposta per me. – Claudio

Problemi correlati