UISearchDisplay падает из-за значения ключа

У меня есть рабочий контроллер табличного представления, который заполняется на основе XML-файлов, соответствующих предыдущему контроллеру табличного представления. Все работает отлично, пока я не попытался добавить UISearchDisplayController.

Пройдя несколько уроков, я попытался реализовать их код, но мое приложение продолжает падать с ошибкой ниже:

** Завершение работы приложения из-за невыполненной исключительной ситуации NSUnknownKeyException, причина: '[<__ NSCFString 0x175949e0> valueForUndefinedKey:]: этот класс не соответствует значению ключа, соответствующему кодировке для имени ключа.' **

Вот некоторые соответствующие фрагменты кода для моего файла.m:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return self.searchResults.count;
    } else {
        return _Refs.SubReference.count;
    }      
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    SubRefCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"TableCell"forIndexPath:indexPath];

    if (cell == nil) {
        NSLog(@"Error with nil cell");
    }

    int row=[indexPath row];

    if (tableView == self.searchDisplayController.searchResultsTableView) {

        cell.subRefLabel.text = self.searchResults[row];
        cell.subRefDescLabel.text = _Refs.SubRefDesc[row]; //fix later

    } else {
        //set all the cells with the Sub Reference names and their descriptions
        cell.subRefLabel.text = _Refs.SubReference[row];
        cell.subRefDescLabel.text = _Refs.SubRefDesc[row];
    }
    return cell;
}

#pragma Search Methods

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
    //self.searchSubRef = _Refs.SubReference;
    NSLog(@"Here is a list of refs %@",_Refs.SubReference);

    //crashes right after this line
    self.searchResults = [_Refs.SubReference filteredArrayUsingPredicate:resultPredicate];
    NSLog(@"Test");        
}

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

У меня есть пользовательские ячейки и проверено на "!" на всех выходах и для моего контроллера табличного представления и для моей ячейки табличного представления, но они все, казалось, были в порядке. Я также пытался открыть раскадровку как исходный код и искать розетки под названием "name", но безуспешно.

Есть идеи, что идет не так и почему приложение вылетает, как только я пытаюсь набрать в строке поиска?

2 ответа

Решение

Я обнаружил, что проблема была с моим NSPredicate.NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];

Он пытается найти повторно используемый идентификатор ячейки name который я никогда не заявлял. Таким простым решением было использовать SELF вместо.

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

Проблема заключалась в том, что отсутствовал оператор инициализации UITableViewCell. Вы удаляете ячейку таблицы, не создавая ее в первую очередь.

Вам нужно следующее утверждение, если очередь возвращает ноль,

 if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TableCell"];
 }

Что если dequeueReusableCellWithIdentifier возвращает nil, где его создаем?

Кроме того, вы используете разные варианты инициализатора, для этого вам нужно зарегистрировать файл класса или пера, используя registerNib: forCellReuseIdentifier: или registerClass: forCellReuseIdentifier: метод перед вызовом следующего метода,

 [tableView dequeueReusableCellWithIdentifier:@"TableCell" forIndexPath:indexPath]

Зарегистрируйте перо в вашем viewDidLoad следующим образом

UINib *cellNib = [UINib nibWithNibName:@"SubRefCell" bundle:nil];
[myTable registerNib:cellNib forCellReuseIdentifier:@"TableCell"];
Другие вопросы по тегам