Подтвердить что ты не робот

Пользовательский 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, но, я думаю, эта проблема остается нерешенной. Поэтому я готов попробовать любые способы заставить его работать.

4b9b3361

Ответ 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 и другие элементы.