How do I filter this object array using NSPredicate filteredArrayUsingPredicate / predicateWithBlock?
班级Person
是我的模态类,有几个属性,如firstName
,lastName
等。
该类的每个对象都存储在数组objPersonCell
中。从我的视图控制器我使用:{/ p>在UITableViewCell
上显示字段
// way similar to this
for(NSMutableArray *obj in self.objPersonCell){
lblFirstName.text = [(Person *)obj personType];
}
问题:对于搜索,我希望用户使用NSPredicate
键入并过滤objPersonCell,并通过在UITableView上重新加载数据立即反映更改。现在我如何使用NSPredicate
。
我尝试的是:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *searchTerm = [textField.text stringByReplacingCharactersInRange:range withString:string];
[self updateAsPerSearchTerm: searchTerm];
return YES;
}
-(void)updateAsPerSearchTerm:(NSString *)searchTerm
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self contains[cd] %@",searchTerm];
NSArray *sortedArray = [[(Person *)self.objPersonCell] filteredArrayUsingPredicate:predicate];
[self.objPersonCell removeAllObjects];
[self.objPersonCell addObjectsFromArray:sortedArray];
[self.tableView reloadData];
}
updateAsPerSearchTerm
内的代码传递objPersonCell是错误的。我该如何设置它。如果能predicateWithBlock
如何更好地帮助我?
答案 0 :(得分:1)
你似乎对铸造感到困惑。这段代码:
for(NSMutableArray *obj in self.objPersonCell){
lblFirstName.text = [(Person *)obj personType];
}
应该是
for (Person *obj in self.objPersonCell){
lblFirstName.text = [obj personType];
}
因为objPersonCell
数组的内容是Person
个对象。
类似的问题在这里:
NSArray *sortedArray = [[(Person *)self.objPersonCell] filteredArrayUsingPredicate:predicate];
你应该在哪里
NSArray *sortedArray = [self.objPersonCell filteredArrayUsingPredicate:predicate];
现在,关于您的过滤问题,您应该有几个属性:
@property (strong, nonatomic) NSMutableArray *objPersonCell;
@property (strong, nonatomic) NSArray *tableDataSource;
默认情况下:
self.tableDataSource = self.objPersonCell;
进行搜索时:
self.tableDataSource = sortedArray;
取消/完成搜索时:
self.tableDataSource = self.objPersonCell;
通过这种方式,您在搜索(并破坏其内容)时永远不会编辑objPersonCell
,并且您的表数据源方法仍然很简单,因为您并未尝试在不同的源阵列之间切换。表数据源方法应仅使用tableDataSource
,而不是objPersonCell
。