Приложение падает, когда я использую NSPredicate, чтобы отфильтровать массив для моего UITableView - PullRequest
0 голосов
/ 23 января 2020

Я использую 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];

    }
}  

My 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:]: этот класс не совместим с кодировкой значения ключа для отображаемого имени ключа».

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 23 января 2020

Попробуйте следующий код.

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

Надеюсь, это поможет вам.

1 голос
/ 23 января 2020

ваш 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];
...