2014-10-14 2 views
0

, истекающего приложение из-за неперехваченное исключение» NSUnknownKeyException « причины:» [< __NSCFString 0x9c7aaf0> valueForUndefinedKey]: этот класс не значение ключа кодирования совместимый для имени ключаНагрузочного приложение из-за неперехваченное исключение «NSUnknownKeyException», причина: «этот класс не является значение ключа кодирования совместимым для имени ключа

Я искал всю StackOverflow с этой ошибкой, но я вмятина найти решение я думаю, у меня есть другая проблема.

Я пытаюсь реализовать UISearchDisplayController в моем проекте у меня есть UITableView отображения некоторый контент из базы данных SQLite и после показа я хочу искать с тем, что я хочу, но я не в состоянии сделать это, пожалуйста, кто-нибудь помощь

Здесь мой код:

-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
     NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText]; 
     searchResults = [jobTitleArray filteredArrayUsingPredicate:resultPredicate];` 
} 

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString 
{ 
    [self filterContentForSearchText:searchString scope: 
    [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]]; 
    return YES; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    //int rowCount; 
    if (tableView == self.searchDisplayController.searchResultsTableView) 
    { 

    NSLog(@"Search count %d",[searchResults count]); 
    return [searchResults count]; 


    } else 
    { 

    NSLog(@"jobTitleArray Search count %d",[jobTitleArray count]); 
    return [jobTitleArray count]; 

    } 
    //return rowCount; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    JobDetailViewController *jobD = [[JobDetailViewController alloc] init];` 

    NSLog(@"Before: %@", jobD); 

    if (tableView == self.searchDisplayController.searchResultsTableView) { 
     [self performSegueWithIdentifier: @"showJobDetail" sender: self]; 
    } 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath` 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    //jobTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    jobTableCell *cell = (jobTableCell *)[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];` 

    if (cell == nil) { 
     cell = [[jobTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 
    JobDone *jobD = nil; 
    if (tableView == self.searchDisplayController.searchResultsTableView) { 

     NSLog(@"job %@",searchResults); 
     jobD = [searchResults objectAtIndex:indexPath.row]; 

    } else 
    { 
     jobD = [jobTitleArray objectAtIndex:indexPath.row]; 
    } 
    cell.companyLabel.text=[companyArray objectAtIndex:indexPath.row]; 

    cell.titleLabel.text = [jobTitleArray objectAtIndex:indexPath.row]; 

    cell.descLabel.text=[descArray objectAtIndex:indexPath.row]; 
    return cell; 
} 


@end 
+0

Итак, где он падает? Это [self performSegueWithIdentifier: @ "showJobDetail" отправитель: self]? – James

+0

его сбой после filterContentForSearchText. – Nagarjun

ответ

1

Ваше сообщение об ошибке сообщает, где искать. В нем говорится, что «этот класс не соответствует ключевому значению для кода name». Итак, где вы используете name? Похоже, что jobTitleArray не имеет атрибута name.

Я не вижу, что jobTitleArray выглядит, но если это просто массив строк, возможно, вы хотели что-то вроде:

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"self contains[c] %@", searchText]; 

, который использует self вместо name.


Глядя более внимательно на свой код, я вывел, что jobTitleArray должно быть: массив строк.

Но я отмечаю, что у вас есть отдельные массивы, jobTitleArray, companyArray и descArray. Это будет проблемой, потому что вы фильтруете на основе одного из этих массивов. Итак, как вы будете фильтровать другие?!?

Решение состоит в том, чтобы сохранить все три из них в одном массиве. Например, если у вас один массив вида:

NSArray *jobs = @[ 
        @{@"name" : @"Manager of Purchasing", @"company" : @"Amazon", @"description": @"blah, blah, blah"}, 
        @{@"name" : @"VP of Sales",   @"company" : @"Ebay", @"description": @"blah, blah, blah"} 
       ]; 

Затем ваш оригинальный фильтр в настоящее время работает:

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText]; 

Если вы фильтруется выше для «покупки», вы бы получить полную словарную запись для задания Amazon. Это позволяет синхронизировать все три атрибута друг с другом.

Обратите внимание, что этот метод хорошо работает и с настраиваемыми объектами, но, надеюсь, это иллюстрирует основную идею: используйте единый массив объектов с несколькими свойствами, а при фильтрации по одному из этих свойств вы получите объекты их свойств все еще в такт.

+0

Что мне делать вместо jobTitleArray? – Nagarjun

+0

В чем состоит 'jobTitleArray'? Просто массив строк? Затем используйте 'self' вместо' name'.Если 'jobtitleArray' состоит из массива словарей или пользовательских объектов, тогда нам нужно будет увидеть, на что похоже, ответить на ваш вопрос. – Rob

+0

да, это действительно помогает и тому же, что я нашел в http://www.appcoda.com/how-to-add-search-bar-uitableview/ – Nagarjun