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

UISearchDisplayController изменение высоты строки

Я установил высоту строки UITableView в Interface Builder до 54.0. У меня есть UISearchDisplayController. Когда пользователь вставляет в него строку поиска, таблица правильно изменяется. Однако, когда они начинают печатать (и фактически выполняют поиск), высота строки уменьшается. Он остается недействительным, пока поиск не ударит Отмена.

Я не могу найти документацию об этом поведении на сайте Apple.

Я попытался установить высоту строки в UISearchDisplayDelegate делегированных вызовах. Это может быть правильный подход, но я не знаю деталей и не могу заставить его работать.

Я также попытался реализовать - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;. Это сработало, но у меня есть тысячи записей в этом списке и не может принять удар по производительности.

Какой правильный способ исправить это?

4b9b3361

Ответ 1

Правильный способ сделать это - использовать следующий делегат.

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView
{
    tableView.rowHeight = 54.0f; // or some other height
}

Он вызывается, когда создается или отображается UITableView.

Если вы случайно вызываете searchDisplayController.searchResultsTableView в другом коде, когда поиск не выполняется, он заранее создаст UITableView. Если вы используете метод делегата willShow для установки rowHeight, он пропустит время (по какой-то причине), чтобы изменить rowHeight, если tableView был создан заранее.

Ответ 2

Я нашел его!

Предполагая, что таблица хранится в tableView:

- (void)viewDidLoad;
{
    [super viewDidLoad];
    self.searchDisplayController.searchResultsTableView.rowHeight = tableView.rowHeight;
}

Больше ничего не нужно.

Изменить: см. ответ netmikey для лучшего решения.

Ответ 3

Стив, ваше решение не сработало для меня: первый раз результат поиска будет отображаться хорошо, но когда пользователь нажимал "Отмена" (закрывая панель поиска), а затем снова открывал его и вводил поисковый запрос в он, высота будет неправильной снова.

Решение DigDog с использованием searchDisplayController:didShowSearchResultsTableView было отработанным, но пользователи увидели, что высота ячейки "прыгает" при запуске поиска.

Решение, которое я нашел, устраняет обе эти проблемы:

- (void)searchDisplayController: (UISearchDisplayController *)controller 
 willShowSearchResultsTableView: (UITableView *)searchTableView {

    searchTableView.rowHeight = myTableView.rowHeight;
}

... в UISearchDisplayDelegate.

С уважением, netmikey

Ответ 4

В viewDidLoad:

вы можете настроить делегат контроллера отображения для себя:

- (void)viewDidLoad 
{
    self.searchDisplayController.delegate = self;
}

Затем реализуйте делегат представления таблицы в контроллере представления:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (tableview == self.searchDisplayController.tableView) {
        return 55;
    } else if (tableView == self.tableView) {
       return  44;
     }
}

Ответ 5

Переопределение метода didLoadSearchResultsTableView должно сделать трюк.

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView {
    tableView.rowHeight = 82.0; // Change height of search result row
}

Больше объяснений от этого блога

Ответ 6

Вам нужно установить оба

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {    
    return 54.;
}

и

self.tableView.rowHeight = 54.;

также в вашем UISearchDisplayDelegate

- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {
    tableView.rowHeight = 54.; 
}

В противном случае, когда "Нет результата" произошло при поиске, высота ячейки вернется к умолчанию.

Ответ 7

Я использую ios 7.0 и Xcode 5.0. Я думаю, вы должны изменить высоту строки в этом методе:

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

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

Ответ 8

Ни один из решений не работал у меня...

Сделал мой собственный хит и пробный... и получил его работу...

Если вам нужны разные высоты строк для обычных и поисковых таблиц...

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
// for normal results
     if (tableView==self.tableView) return 54;
// for search results
     else return 54; }

И если вам нужна общая высота...

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
     return 54; }

PS: Имейте в виду, если у вас одинаковая высота строки для каждой строки, этот метод не очень эффективен для использования ресурсов, поскольку высота строки пересчитывается для каждой ячейки... Хотя это незаметно в В большинстве случаев я все еще ищу лучшее решение!