Как показать / скрыть UISearchController searchBar в UITableView?

В моем приложении у меня следующая настройка:

  • UIViewController
  • UITableView как подпредставление
  • tableView имеет UISearchController, а панель поиска представляет собой представление заголовка таблицы

    _tableView.tableHeaderView = _searchController.searchBar;

Я хочу добиться:

  • когда появляется этот экран, searchBar отсутствует
  • нажмите какую-нибудь кнопку (например, правую кнопку навигационного контроллера), появится панель поиска (возможно, анимация сверху или что-то в этом роде)
  • нажмите эту кнопку еще раз, панель поиска скрывается

когда панель поиска не отображается, таблица выглядит так, как будто этой панели никогда не было (нет пустой ячейки заголовка или чего-то в этом роде)

Любая помощь приветствуется!


person Eugene Gordin    schedule 10.02.2016    source источник


Ответы (2)


Сам понял, что это, возможно, не самое оптимальное решение, но если у кого-то есть идея получше, я с радостью приму это в качестве ответа.

-(void)searchButtonDidTap:(UIButton*)aButton
{    
     if (!_searchController){

     _searchController = [[UISearchController alloc] initWithSearchResultsController:nil];

    _searchController.searchResultsUpdater = self;
    [_searchController.searchBar sizeToFit];
    _tableView.tableHeaderView = _searchController.searchBar;

    _searchController.delegate = self;
    _searchController.dimsBackgroundDuringPresentation = NO;

    self.definesPresentationContext = YES;
    _searchController.active = NO;

    _searchController.searchResultsUpdater = self;
    _searchController.dimsBackgroundDuringPresentation = NO;
    self.definesPresentationContext = YES;
    _tableView.tableHeaderView = _searchController.searchBar;

    _searchController.searchBar.delegate = self;
    }
    else
    {
    _searchController.active = NO;
    [_searchController removeFromParentViewController];
    _searchController = nil;
    _tableView.tableHeaderView = nil;
    }

    [_tableView reloadData];
}
person Eugene Gordin    schedule 10.02.2016

Есть много способов сделать это, но я бы сделал что-то вроде следующего:

  1. Обновите метод viewForHeaderInSection, чтобы отображать заголовок только тогда, когда новое свойство класса с именем _showHeader имеет значение true:

    if(_showHeader) { // insert code for showing the header: // return HeaderCell; } else { return nil; }

  2. Когда пользователь нажимает кнопку, чтобы отобразить заголовок, установите некоторую переменную и вызовите reloadData в tableView:

    _showHeader = YES; [_tableView reloadData];

person user1557949    schedule 10.02.2016