2015-06-30 3 views
5

Я не вижу никакой проблемы с этой строкой кода. Почему он не может разобрать?NSPredicate не может разобрать строку формата

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

Журнал также не помогает.

Нагрузочный приложение из-за неперехваченного исключением 'NSInvalidArgumentException', причина: «Невозможно разобрать строку формата «(имя пользователя СОДЕРЖИТ [CD]% 1 $ @) || (идентификатор пользователя СОДЕРЖИТ [кд]% 1 $ @) || (Firstname СОДЕРЖИТ [кд]% 1 $ @) || (фамилия СОДЕРЖИТ [CD]% 1 $ @) "»

Редактировать 1:

Хорошо, кажется, как predicateWithFormat не понимает «% 1 $ @». Я переключаю его на

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

Он прошел линию. Но, следующая задача:

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

Нагрузочного приложение из-за неперехваченное исключение «NSUnknownKeyException», причины: «[valueForUndefinedKey]: сущность Пользователь не ключевое значения кодирования-совместимый для ключа" а».»

«a» - это ключевое слово, которое я ввел в searchTextBox. ВТ?

я распечатал предикат в консоли отладки, не выглядит ничего плохого:

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

Edit 2:

Хорошо, проблема решена с этим супер уродливый код:

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

Что делать, если я хочу расширить поле поиска в будущем? Мне нужно добавить больше параметров? more ", searchString, searchString, searchString"?

решаемые

Благодаря Ewan и Bannings, что дает 2 варианта на мой вопрос. Я протестировал их обоих, и они работали в качестве очарования. Может ли кто-то объяснить разные между этими двумя, и в каком случае я должен использовать какой вариант?

** NOTE ** ответ

Bannings' все в порядке, пока моя строка поиска не содержит апостроф ', то сбой приложения. Поэтому я считаю, что лучше использовать Эвана.

ответ

7

Вы можете сделать это:

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

Работает отлично! Это то, что мне нужно. Спасибо – Eddie

0

Вам нужно добавить строку для каждой переменной, если вы используете 5% @ необходимо применять либо то же значение SearchString или другое значение заполнения для этого% @

[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

Я вроде знаю, что. Есть ли способ? Поскольку все мои поисковые строки имеют одинаковое значение ... – Eddie

+0

http://stackoverflow.com/questions/7536750/nspredicate-with-multiple-comparisons-for-one-query-string Проверьте это ... – eddwinpaz

+0

Я не хотите использовать сложный предикат, поскольку мой предикат не слишком сложный. – Eddie

3

изменения Try %[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! Это тоже работает. Но я только что принял ответ Эвана. Так жаль. – Eddie

+0

Лучший ответ для меня. – Claudio

Смежные вопросы