自定义对象的 NSPredicate 不起作用

NSPredicate for custom objects not working

我有一组自定义对象,_momsArray。这里显示的是此类数组的单个对象:

Custom *yourMom {
  name = @"Sally M. Brown";
  age = 54;
  weight = 43.2;
}

我 运行 我在 searchBar 委托中的谓词:

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {

    if ([searchText length]<=0) {
        _tableDataArr = [[NSMutableArray alloc] initWithArray:_momsArray];
    } else{

        // filtered _tableDataArr
        NSString *filter = @"name BEGINSWITH[cd] %@";
        NSPredicate* predicate = [NSPredicate predicateWithFormat:filter, searchText];
        NSArray *filteredArr  = [_momsArray filteredArrayUsingPredicate:predicate];
        _tableDataArr = [[NSMutableArray alloc] initWithArray:filteredArr];
    }
    [_momTable reloadData];
}

这没有给出预期的结果。例如,当我键入 S 时,sally 根本不会出现。我的代码有什么问题?

编辑:自定义对象中的字符串包含标点符号,因此与其他答案不同。

您的字符串未正确生成,因此请使用以下代码:

NSPredicate *predicate = [ NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", text];
arrFilterData = [NSArray arrayWithArray:[arrDataList filteredArrayUsingPredicate:predicate]];

输出

搜索前

搜索后

和代码

NSPredicate *predicate = [ NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@", text];
arrFilterData = [NSArray arrayWithArray:[arrDataList filteredArrayUsingPredicate:predicate]];

输出:

Edit

输出:

要使用自定义对象过滤数组,您可以使用此代码。

NSString *str = @"text";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name contains[c] %@", str];
NSArray *arrFiltered = [self.arrDataObject filteredArrayUsingPredicate:predicate];

希望对你有帮助。

使用此代码:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", searchText];
NSMutableArray *filteredArr = [[_momsArray filteredArrayUsingPredicate:pred]mutableCopy];