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