2016-04-29 2 views
4

Я внедрил UISearchController, чтобы он отображал верхнюю позицию UINavigationBar при нажатии на значок поиска. После фильтрации таблицы пользователь должен иметь возможность выбирать строку, которая будет вызывать новый контроллер представлений. Проблема заключается в том, что при этом контроллер поиска все еще отображается поверх панели навигации.Нажатие контроллера просмотра при представлении UISearchController через UINavigationBar

Я исследовал это, и было предложено установить self.definedPresentationContext на true. Это не работает, когда панель поиска отображается поверх панели навигации. При нажатии на значок поиска клавиатура появляется, но панель поиска не анимировать.

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

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

Я искал образец кода UIKit для Apple, чтобы показать нежелательное поведение. Чтобы воспроизвести проблему, download this project, запустите ее на iPhone, нажмите кнопку «Назад», выберите «Поиск», выберите «Наверх», нажмите значок поиска, введите поисковый запрос и выберите результат. Обратите внимание, что панель поиска остается видимой. Вот код из SearchPresentOverNavigationBarViewController.swift:

override func viewWillDisappear(animated: Bool) { 
    super.viewWillDisappear(animated) 

    if searchController.active { 
     //searchController.active = false //undesirably dismisses search, animates away during push, upon going back search is not active 
    } 
} 

@IBAction func searchButtonClicked(button: UIBarButtonItem) { 
    //self.definesPresentationContext = true //causes the search to not appear 

    searchController = UISearchController(searchResultsController: nil) 
    searchController.searchResultsUpdater = self 
    searchController.dimsBackgroundDuringPresentation = false 
    searchController.hidesNavigationBarDuringPresentation = false 

    presentViewController(searchController, animated: true, completion: nil) 
} 

ответ

0

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

Итак, предположим, вы представили свой интерфейс поиска, пользователь набрал что-то в поле поиска, и вы показали им некоторые результаты. После выбора результата я нажимаю новый контроллер представления на исходный навигационный контроллер, то есть контроллер навигации, содержащий контроллер вида, который представляет интерфейс поиска. Когда я это делаю, интерфейс поиска попадает влево, и когда вы нажимаете кнопку «Назад», интерфейс поиска возвращается и его состояние (запрос и результаты) сохраняется.

Следует отметить, что в контроллере, который содержит контент для поиска, тот, который представляет интерфейс поиска, я включил контекст представления.

Кроме того, моя панель поиска интегрирована в представление заголовка табличного представления, которое отображает содержимое поиска, поэтому я не представляю интерфейс поиска явно - когда пользователь вступает в поле поиска, он автоматически поднимается и выталкивает навигационную панель из экрана. Это единственное отличие в наших установках, о которых я могу думать. В любом случае, надеюсь, это поможет вам. Ура!

Смежные вопросы