Результат поиска UISearchDisplayController имеет другой макет и поведение ячейки, чем искомая таблица.

Я использую раскадровку. У меня есть UITableView с одной ячейкой-прототипом. Эта ячейка имеет стиль «подзаголовок». Я добавил переход от ячейки к подробному представлению. Поэтому, когда пользователь нажимает на ячейку, он открывает соответствующий редактор... Все отлично работает.

Теперь я добавил UISearchDisplayController и UISearchBar, реализовал делегаты. Это работает очень хорошо.

Но в таблице результатов поиска ячейки имеют стиль «по умолчанию» и не доступны для нажатия. Что мне нужно сделать, чтобы таблица результатов выглядела и вел себя как «непоисковая» таблица?


person Shingoo    schedule 30.11.2011    source источник
comment
Причина этого в том, что UISearchDisplayController создает свой собственный UITableView, следовательно, он создает его с ячейками по умолчанию.   -  person A Salcedo    schedule 01.12.2011


Ответы (5)


Я хотел бы внести свой вклад в ответ № 1, это то, что я сделал, и это сработало для меня.

в методе

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

вместо присвоения ячейки из параметра tableView

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

назначьте его непосредственно из TableView в представлении, поэтому вам нужно заменить это

// UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

с этим

 UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
person jcubero    schedule 12.09.2012
comment
Это помогло мне. Поскольку все ячейки прототипа находятся в обычном/исходном табличном представлении, а не в поисковом табличном представлении, рекомендуется использовать self. вместо параметра передан tableview! - person StuFF mc; 04.01.2013

Нашел проблему...

Метод

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

вытащил ячейку из tableView, которая в результате является не tableView из раскадровки, а resultTableView из SearchDisplayController.

Теперь я получаю ячейку для отображения в обоих случаях из табличного представления в раскадровке, и теперь это работает.

person Shingoo    schedule 01.12.2011
comment
Привет, Shingoo. Не могли бы вы объяснить или показать свой код, который устранил эту проблему? - person dnstevenson; 09.02.2012
comment
My View - это не просто табличное представление. Мне нужно было фоновое изображение, поэтому tableview встроен в uiview. контроллер представления имеет выход к табличному представлению. когда вызывается cellForRowAtIndexPath, теперь я получаю ячейку из выхода tableView, поэтому ячейка всегда получается из представления таблицы, настроенного в построителе интерфейса. - person Shingoo; 15.02.2012

Я использую ios 7.0 и Xcode 5.0. Я обнаружил, что контроллер отображения поиска использует тот же макет табличного представления, что и контроллер представления делегата. Все, что вам нужно сделать, это решить, является ли текущее представление таблицы представлением таблицы контроллера представления делегата или представлением таблицы контроллера отображения поиска. Но не забудьте добавить предложение

tableView.rowHeight = self.tableView.rowHeight;

в следующем фрагменте кода:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
if (tableView == self.searchDisplayController.searchResultsTableView)
{
    tableView.rowHeight = self.tableView.rowHeight;//very important!
    return [self.searchResults count];
}
else
{
    ...
    return ...;
}
}

если вы забудете реализовать это предложение, тогда строка табличного представления отображения поиска будет только такой же высокой, как строка по умолчанию, что заставляет вас думать, что она не похожа на «непоисковую» таблицу.

person little pig    schedule 14.01.2014

Возможный ответ на этот здесь. Это может не работать полностью для вас, но, как я объяснил, UISearchDisplayController создает табличное представление.

Проверьте документацию, и вы сможете лучше понять ее, но в ней говорится:

Вы инициализируете контроллер отображения поиска с помощью панели поиска и контроллера представления, отвечающего за управление исходным содержимым для поиска. Когда пользователь начинает поиск, контроллер отображения поиска отвечает за наложение интерфейса поиска на представление исходного контроллера представления и отображение результатов поиска. Результаты отображаются в виде таблицы, созданной контроллером отображения поиска. В дополнение к исходному контроллеру представления логически есть еще четыре роли. Обычно все они воспроизводятся одним и тем же объектом, часто самим исходным контроллером представления.

person A Salcedo    schedule 30.11.2011
comment
Спасибо за Ваш ответ. Я отладил свой код, и да, методы источника данных вызываются. Правильная ячейка также извлекается из раскадровки и заполняется правильными данными, но в таблице результатов отображается стиль ячейки таблицы по умолчанию... Я не могу понять, почему... - person Shingoo; 01.12.2011

В моем случае UISearchDisplayController использовал правильный тип ячейки (пользовательский), но высота ячейки была неправильной, поэтому мне пришлось использовать

(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

способ исправить это.

person Michal Gumny    schedule 21.07.2013