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

Posted

技术标签:

【中文标题】当我使用 NSPredicate 为我的 UITableView 过滤我的数组时,应用程序崩溃【英文标题】:App crashes when I use NSPredicate to filter my Array for my UITableView 【发布时间】:2020-01-23 10:32:18 【问题描述】:

我正在使用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 = "ozam@abc.com";
    uuid = "user-97ae136";
,

    displayname = OzaMihir;
    email = "om@abc.com";
    uuid = "user-0c97f16";

)  

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

由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[valueForUndefinedKey:]:此类不符合键显示名称的键值编码。”

提前致谢。

【问题讨论】:

@anbu.Karthik 它崩溃了 【参考方案1】:

你的 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];

【讨论】:

当我输入 O 时它不起作用,它没有显示我的第二条记录。请查看我的问题中的数组。 我用的和你给的一样!你想让我更新我的问题吗? 我的应用程序没有崩溃,但只有当我输入“O”时它才没有显示第二条记录。 @MihirOza - 如果您输入 irm 它会显示 2 条记录或 1 条记录...? 你说得对,兄弟。实际上这是我的 cellForRowAtIndexPath 问题。【参考方案2】:

试试下面的代码。

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];

希望对你有帮助。

【讨论】:

当我输入“O”时它不起作用,它没有显示我的第二条记录。请查看我的问题中的数组。 我在两个答案中都面临同样的问题。 已经@Anbu.Karthik 给了同一个兄弟。有时它会给出奇怪的结果。当我输入“O”时,它没有显示第二条记录。 很高兴帮助你,兄弟。 @MihirOza 如果您想使用NSPredicate 对阵列执行任何其他操作,请关注此link

以上是关于当我使用 NSPredicate 为我的 UITableView 过滤我的数组时,应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:使用 SQLITE 存储类型时,包含对多关系的 NSPredicate 不会产生任何结果

带有搜索栏的 cell.accessoryType 不影响 NSPredicate

NSFetchResultsController 的 NSPredicate

NSPredicate 中 NSString 的问题

日期的核心数据 NSPredicate

coredata NSPredicate 中的日期比较