Пользовательский CellIdentifier является Null при использовании Search Display Controller
В моем представлении таблицы есть пользовательские ячейки, которые я инициализирую из класса UITableViewCell. У меня есть разделы для первых букв записей и есть indexPath, который создается динамически.
Я хотел добавить контроллер отображения для просмотра в таблицу. Таким образом, я сделал, создал все методы для фильтрации данных. Я уверен, что мои функции работают хорошо, потому что я печатаю количество массивов на экране для результатов поиска.
Моя проблема в том, что при первом просмотре времени данные отображаются на экране. Но когда я попал на вход поиска и набрал букву, я получаю ошибку 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'
. После того, как я использовал точку останова, я увидел, что моя обычная ячейка равна нулю после поиска. Данные существуют, но ячейка не инициализируется.
Вот код, который я использую для пользовательской инициализации ячейки:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"ObjectCell";
SpeakerCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
NSDictionary *myObject = [[sections valueForKey:[[[sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];
cell.label1.text = [myObject objectForKey:@"myValue"];
return cell;
}
Я считаю, что допустил ошибку, поставив контроль в IB. Поэтому я добавил скриншоты объектов:
![enter image description here]()
Инспектор подключений для представления моей таблицы
![Connections inspector for my table view]()
Инспектор подключений для контроллера отображения поиска
![enter image description here]()
EDIT: проблема действительно решена, я использовал UISearchBar вместо Search Display Controller, но, я думаю, эта проблема остается нерешенной. Поэтому я готов попробовать любые способы заставить его работать.
Ответы
Ответ 1
Как здесь вопрос о контроле дисплея дисплея,
вам нужно получить доступ к self.tableView
вместо tableView
:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CellId"];
// do your thing
return cell;
}
Ответ 2
Для тех, кто использует iOS 5 и StoryBoards, вы хотите использовать следующий метод вместо initWithIdentifier:
initWithStyle: (UITableViewCellStyle) stylereuseIdentifier: (NSString *) reuseIdentifier
Пример:
NSString *cellIdentifier = @"ListItemCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
Ответ 3
Я не уверен, как это должно работать в хранилище.
Но обычно вы должны проверить, возвращает ли [tableView dequeueReusableCellWithIdentifier:CellIdentifier]
ячейку.
Поскольку, если ячейка не загружена раньше или нет каких-либо ячеек для повторного использования, вам придется создать новую ячейку:
SpeakerCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[SpeakerCell alloc] initWithIdentifier: CellIdentifier];
}
Также, когда при объявлении локальных переменных в Objective-C мы не собираемся использовать первую букву.
Ответ 4
У меня была такая же проблема, когда пользовательские ячейки (встроенные в Storyboard) не рисовались, как только первая буква была помещена в поле поиска. Однако поиск был успешным.
Наконец, я нашел хороший учебник от Brenna Blackwell, предлагающий настроить вручную чертеж ячейки в соответствующем подклассе UITableViewCell, добавив UILabels и другие элементы.