NSPredicate 101:如何在NSMutableArray的自定义对象中使用NSPredicate

3

这是一个相当基础的问题,虽然我认为我已经理解了NSPredicate的基本原理,但我仍然有点困惑,不知道为什么会出现错误(searchText是传递到该方法中的NSString对象的指针)。

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

我有一个NSMutableArray存储着自定义对象(例如Person对象),它们都有一个名字属性。我想要做的就是使用NSPredicate在用户在UISearchBar中输入时过滤可能的匹配项。IB组件非常简单,并且似乎工作正常。当我尝试搜索和开始过滤时,应用程序却基本崩溃,并出现以下错误:
'NSInvalidArgumentException' ,原因:'-[xPerson isEqualToString:]:向实例0x8043340发送无法识别的选择器'
我的理解是,谓词将传递给NSMutableArray中的每个对象,谓词中的SELF关键字将引用相应的对象(在这种情况下,我认为甚至不是真正必要的),而.name则可以使用自定义对象的合成属性。但是错误似乎表明-isEqualToString:调用被调用于自定义对象而不是对象的属性。
如果您能提供一些建议,告诉我哪里做错了,我将不胜感激。
2个回答

5

试试这样做:

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

这实际上是我在翻阅一些关于这个主题的 SO 的其他相关线程后尝试过的事情,但我仍然完全得到了同样的错误。 鉴于自定义类是一个裸骨、典型的类,使用默认的自动合成属性(确实是 'name'),NSPredicate 的语法在任何情况下都应该是正确的。我注意到如果我将谓词中的 'contains' 更改为 'like',它就可以正常工作(虽然我没有得到任何结果,但至少不会抛出异常)。为什么会这样,我不知道。有人有什么想法吗? - amerino
我在我的应用程序中几乎有相同的东西,并且使用上面的代码完美地工作。因此,我不确定问题是否出在这里的谓词。 - iDev

0

我遇到了相同的问题。错误不在谓词中,而在于表视图单元格中。 我按照以下方式设置了单元格:

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

我忘记让对象解析。然后我将代码更改为:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接