如何使用NSPredicate过滤此对象数组?

时间:2014-07-24 12:05:33

标签: ios objective-c uitableview nsarray nspredicate

How do I filter this object array using NSPredicate filteredArrayUsingPredicate / predicateWithBlock?

班级Person是我的模态类,有几个属性,如firstNamelastName等。 该类的每个对象都存储在数组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如何更好地帮助我?

1 个答案:

答案 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