使用撇号时无法解析格式字符串nspredicate错误

时间:2012-11-05 11:04:04

标签: iphone objective-c nspredicate

我在搜索框中输入关键字时出现此错误:

  

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'无法解析格式   字符串“(标题CONTAINS [c]'hj'”

我输入任何字符串(在这种情况下为'hj')后跟撇号(或包含撇号) )。没有撇号 - 没有错误。

这就是我所做的:

(void)filter:(NSString*)keyword{
    NSString* predicateString = [NSString stringWithFormat:@"(title CONTAINS[c] '%@')", keyword];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
    self.filteredArray = [self.initialArray filteredArrayUsingPredicate:predicate];
} 

正如我所说,如果关键字中没有包含撇号字符,则代码可以正常工作。

4 个答案:

答案 0 :(得分:11)

萨瓦,试试这个:

(void)filter:(NSString*)keyword{
    NSString *keywordWithBackslashedApostrophes = [keyword stringByReplacingOccurrencesOfString:@"'" withString:@"\\'"];
    NSString* predicateString = [NSString stringWithFormat:@"title CONTAINS[c] '%@'", keywordWithBackslashedApostrophes];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
    self.filteredArray = [self.initialArray filteredArrayUsingPredicate:predicate];
} 

与代码的主要区别在于关键字中的撇号被反斜杠 - 撇号替换。

答案 1 :(得分:3)

我也遇到过这个谓词过滤器的问题我有像O'Connor这样的客户名称,而且查询过去常常失败。 Alexey Golikov建议的解决方案工作正常,但我想知道是否有任何NSPredicate类级别修复。字符串操作总是很昂贵的,你可能不想在必要时这样做。

-anoop

答案 2 :(得分:0)

试着看看这个answer 你可以在没有引号的predicateWithFormat中执行所有操作

[NSPredicate predicateWithFormat:@"title CONTAINS[c] '%@'", keyword]

答案 3 :(得分:0)

当您不需要这样做时,问题是创建一个NSString。请注意,我们不需要NSString变量,我们从%@删除了撇号。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(title CONTAINS[c] %@)", keyword];