[当我使用NSPredicate过滤UITableView的数组时,应用程序崩溃

问题描述 投票:0回答:2

我正在使用NSPredicate作为tableView的搜索记录。以下是我已实现的代码。

-(void)updateSearchArray:(NSString *)searchText {
    if(searchText.length==0) {
        isFilter=NO;
    } else {
        isFilter=YES;
        filteredUsers = [[NSMutableArray alloc]init];
        NSPredicate *resultPredicate;
        resultPredicate = [NSPredicate predicateWithFormat:@"displayname contains[c] %@", searchText];
        NSLog(@"%@",[tableData valueForKey:@"displayname"]);
        filteredUsers = [[tableData valueForKey:@"displayname"] filteredArrayUsingPredicate:resultPredicate];
        [self.tblMemberList reloadData];

    }
}  

我的tableData

Printing description of self->tableData:
<__NSArrayI 0x28116ba60>(
{
    displayname = Mihir;
    email = "[email protected]";
    uuid = "user-97ae136";
},
{
    displayname = OzaMihir;
    email = "[email protected]";
    uuid = "user-0c97f16";
}
)  

当我使用上述代码时,我的应用程序崩溃。

由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[valueForUndefinedKey:]:此类与键显示名的编码不兼容。

提前感谢。

ios objective-c nsmutablearray nsdictionary nspredicate
2个回答
0
投票

您的tableData包含字典数组,因此在这里搜索直接在数组中而不是字符串中进行,因此使用类似

    isFilter=YES;
    filteredUsers = [[NSMutableArray alloc]init];
   filteredUsers = [tableData filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(displayname contains[c] %@)", searchText]];
    [self.tblMemberList reloadData];

而不是

NSPredicate *resultPredicate;
    resultPredicate = [NSPredicate predicateWithFormat:@"displayname contains[c] %@", searchText];
    NSLog(@"%@",[tableData valueForKey:@"displayname"]);
    filteredUsers = [[tableData valueForKey:@"displayname"] filteredArrayUsingPredicate:resultPredicate];

0
投票

尝试下面的代码。

filteredUsers = [temp filteredArrayUsingPredicate: [NSPredicate predicateWithFormat:@"displayname CONTAINS[c] %@", searchText]];
[self.tblMemberList reloadData];

并且您正在代码中传递displayname数组以对其进行过滤。如果只想对displayname数组的数组执行操作。那么您可以按照以下步骤进行操作。

//It will perform operation/search name only on an array of `displayname`
filteredUsers = [[tableData valueForKey:@"displayname"] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@", searchText]]; 
[self.tblMemberList reloadData];

希望对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.