NSPredicate 101:将 NSPredicate 与自定义对象的 NSMutableArray 一起使用

Posted

技术标签:

【中文标题】NSPredicate 101:将 NSPredicate 与自定义对象的 NSMutableArray 一起使用【英文标题】:NSPredicate 101: Using NSPredicate with a NSMutableArray of custom objects 【发布时间】:2012-10-13 05:02:02 【问题描述】:

这是一个非常基本的问题,尽管我认为了解 NSPredicate 的基础知识,但我仍然对为什么在这里遇到错误感到有些困惑(searchText 是一个指向正在生成的 NSString 对象的指针)传递给方法)。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.name contains[cd] %@", searchText];
_searchResults = [_personArray filteredArrayUsingPredicate:predicate];

我有一个 NSMutableArray 的自定义对象(例如,Person 对象),它们有一个 name 属性。我要做的就是在用户开始在 UISearchBar 中输入时使用 NSPredicate 过滤潜在的匹配项。 IB 组件非常简单,并且看起来运行良好。但是,当我尝试搜索并开始过滤时,基本应用程序崩溃并出现以下错误:

'NSInvalidArgumentException', reason: '-[xPerson isEqualToString:]: unrecognized selector sent to instance 0x8043340'

我的理解是谓词将被传递给 NSMutableArray 中的每个对象,谓词中的 SELF 关键字指的是相应的对象(我相信,在这种情况下,它甚至不是真正必要的),并且.name 能够在自定义对象上使用综合属性。该错误似乎表明 -isEqualToString: 正在自定义对象而不是对象的属性上调用调用。

任何关于我做错了什么的建议将不胜感激。

【问题讨论】:

【参考方案1】:

这样试试吧,

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", searchText];
_searchResults = [_personArray filteredArrayUsingPredicate:predicate];

【讨论】:

这实际上是我在翻遍了 SO 的其他一些关于这个主题的其他相关线程之后尝试过的,但我仍然逐字地得到同样的错误。鉴于自定义类是一个简单的骨架,典型的类使用默认的自动合成属性(实际上是“名称”),NSPredicate 的语法在任何一种情况下都应该是正确的。我确实注意到,如果我在谓词中将“包含”更改为“喜欢”,它会正常工作(尽管我没有得到任何结果,但至少不会引发异常)。为什么会这样,我不知道。有人有什么见解吗? 我的应用程序中几乎有相同的东西,它对我来说非常适合上面的代码。所以我不确定这里的谓词是否存在问题。【参考方案2】:

我遇到了同样的问题。错误不在精确值中,而是在表格视图的单元格中。 我是这样设置单元格的:

cell.textLabel.text = [self.searchResults objectAtIndex:indexPath.row];

我忘记解析对象了。然后我把代码改成了这样:

cell.textLabel.text = ((Product*)[self.searchResults objectAtIndex:indexPath.row]).name;

所以,也许你的错误也不在 NSPredicate 中。

【讨论】:

以上是关于NSPredicate 101:将 NSPredicate 与自定义对象的 NSMutableArray 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 从 PHFetchResults 中排除慢动作视频

NSPredicate ANY 只返回与字符串列表中第一个元素的关键字匹配的记录

AND NSPedicate 关于核心数据关系

带有正则表达式捕获的 NSPredicate 总是得到 0 个结果

如何在嵌套字典数组上使用 NSpredicate

常用的正则表达式 身份证信息和银行卡信息的判断