使用撇号时无法解析格式字符串 nspredicate 错误
Posted
技术标签:
【中文标题】使用撇号时无法解析格式字符串 nspredicate 错误【英文标题】:Unable to parse the format string nspredicate error when using apostrophe 【发布时间】:2012-11-05 11:04:04 【问题描述】:在我的搜索框中输入关键字时出现此错误:
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“无法解析格式 string "(title 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];
正如我所说,如果关键字中不包含撇号字符,则代码有效。
【问题讨论】:
【参考方案1】:萨瓦,试试这个:
(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];
与您的代码的主要区别在于关键字中的撇号被反斜杠撇号替换。
【讨论】:
【参考方案2】:我也遇到了这个谓词过滤器的问题,我有像 O'Connor 这样的客户名称,并且查询曾经失败。 Alexey Golikov 建议的解决方案效果很好,但我想知道是否有任何 NSPredicate 类级别的修复。字符串操作始终是一件代价高昂的事情,除非必要,否则您可能不想这样做。
-anoop
【讨论】:
【参考方案3】:试试看这个answer
你可以像predicateWithFormat
那样做所有事情,不用引号
[NSPredicate predicateWithFormat:@"title CONTAINS[c] '%@'", keyword]
【讨论】:
是的,但是尝试使用单个 predicateWithFormat 来做到这一点,我猜不需要用 stringWithFormat 扩展它【参考方案4】:问题是当您不需要创建 NSString 时。请注意,我们不需要 NSString 变量,并且我们从 %@
中删除了撇号。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(title CONTAINS[c] %@)", keyword];
【讨论】:
以上是关于使用撇号时无法解析格式字符串 nspredicate 错误的主要内容,如果未能解决你的问题,请参考以下文章