当我使用 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 - 如果您输入i
或 r
或 m
它会显示 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