3

这是一个非常基本的问题,即使我认为了解 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: 正在自定义对象而不是对象的属性上调用调用。

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

4

2 回答 2

5

试试这样

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", searchText];
_searchResults = [_personArray filteredArrayUsingPredicate:predicate];
于 2012-10-13T05:16:25.930 回答
0

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

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

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

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

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

于 2013-03-03T07:07:41.287 回答