Ответ 1
отредактировать на обычном компьютере...
Итак, есть пара вещей, о которых нужно знать:
- Вам не нужно помещать кавычки вокруг замещающего заполнителя в строку формата. Когда метод строит предикат, он будет создавать абстрактное синтаксическое дерево объектов
NSExpression
иNSPredicate
(в частностиNSComparisonPredicate
иNSCompoundPredicate
). Ваша строка будет помещена вNSExpression
типаNSConstantValueExpressionType
, что означает, что она уже будет интерпретироваться как обычная строка. Размещение одиночных кавычек в строке формата фактически сделает ваш предикат нефункциональным. - Вы не ограничены одним сравнением в предикате. Из его звуков вы хотите иметь столько сравнений, сколько слов в строке поиска (
nameVar
). В этом случае мы сломаемnameVar
до его составных слов и создадим сравнение для каждого слова. Как только мы это сделали, мыAND
их вместе, чтобы создать единый всеобъемлющий предикат. Код ниже делает именно это.
оригинальный ответ
Вы можете сделать это, создав свой собственный NSCompoundPredicate
:
NSString *nameVar = ...; //ex: smith m
NSArray *names = ...; //ex: John Smith, Mary Smith
NSArray *terms = [nameVar componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSMutableArray *subpredicates = [NSMutableArray array];
for(NSString *term in terms) {
if([term length] == 0) { continue; }
NSPredicate *p = [NSPredicate predicateWithFormat:@"name contains[cd] %@", term];
[subpredicates addObject:p];
}
NSPredicate *filter = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates];
[fetchController setPredicate:filter];
Предупреждение: набрано в браузере на моем iPhone.