NSPredicate无法解析格式字符串

Edd*_*die 5 objective-c nspredicate ios

我看不出这些代码行有什么问题.为什么不能解析?

[NSPredicate predicateWithFormat:@"(username  CONTAINS[cd] %1$@) || "
                                  "(userId    CONTAINS[cd] %1$@) || "
                                  "(firstname CONTAINS[cd] %1$@) || "
                                  "(lastname  CONTAINS[cd] %1$@)", searchString]"
Run Code Online (Sandbox Code Playgroud)

日志也无济于事.

由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'无法解析格式字符串"(用户名CONTAINS [cd]%1 $ @)||(userId CONTAINS [cd]%1 $ @)||(名字CONTAINS [ cd]%1 $ @)||(姓氏CONTAINS [cd]%1 $ @)"'

编辑1:

好吧,似乎predicateWithFormat不理解"%1 $ @".我切换到

[... predicateWithFormat:[NSString stringWithFormat:...]] // (same format as above)
Run Code Online (Sandbox Code Playgroud)

它通过了这条线.但是,下一个问题是:

self.filteredUserList = [self.userList filteredArrayUsingPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)

由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[valueForUndefinedKey:]:实体用户不是密钥值编码兼容的密钥"a".

"a"是我在searchTextBox中输入的关键字.WUT?

我在调试控制台中打印出谓词,看起来没有错:

username CONTAINS[cd] a OR userId CONTAINS[cd] a OR firstname CONTAINS[cd] a OR lastname CONTAINS[cd] a
Run Code Online (Sandbox Code Playgroud)

编辑2:

好的,这个超级丑陋的代码解决了问题:

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

如果我想在将来扩展搜索字段怎么办?我必须添加更多参数?更多",searchString,searchString,searchString"?

解决了

感谢Ewan和Bannings,给出了我的问题的2个选项.我测试了他们两个,他们的工作是一种魅力.有人可以解释这两者之间的差异,在哪种情况下我应该使用哪个选项?

**注意**

Bannings的回答没问题,直到我的搜索字符串包含单引号',然后应用程序崩溃.所以我认为使用Ewan的更好.

Ewa*_*lor 7

你可以这样做:

[[NSPredicate predicateWithFormat:@"(username CONTAINS[cd] $str) || ..."] predicateWithSubstitutionVariables:@{@"str": searchString}];
Run Code Online (Sandbox Code Playgroud)