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

时间:2012-10-13 05:02:03

标签: objective-c ios nsmutablearray nspredicate

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

对我所做错的任何建议都会非常感激。

2 个答案:

答案 0 :(得分:5)

尝试这样,

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

答案 1 :(得分:0)

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

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

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

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

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