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

UISearchController сохраняется после segue

У меня есть приложение с UISearchController. Этот элемент пользовательского интерфейса полностью настроен таким образом:

searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.searchBar.delegate = self
searchController.dimsBackgroundDuringPresentation = false
searchController.hidesNavigationBarDuringPresentation = false
searchController.searchBar.searchBarStyle = UISearchBarStyle.Minimal

searchController.searchBar.frame = CGRectMake(searchController.searchBar.frame.origin.x, searchController.searchBar.frame.origin.y, searchController.searchBar.frame.size.width, 44.0)

Затем я добавляю его в свой tableView tableHeaderView

tableView.tableHeaderView = searchController.searchBar

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

screenshot

4b9b3361

Ответ 1

Вы можете скрыть свой контроль searchController вручную, установив для активного свойства значение false в prepareForSegue. Добавьте код ниже в prepareForSegue()

searchController.active = false

В качестве альтернативы вы должны добавить следующую строку в viewDidLoad(), чтобы получить поведение по умолчанию

definesPresentationContext = true

Из документации для definesPresentationContext

Логическое значение, указывающее, рассматривается ли это представление контроллера просмотра, когда контроллер представления или один из его потомков представляет контроллер представления.

Обсуждение

Когда представлен контроллер представления, iOS начинается с контроллера представления представления и спрашивает его, хочет ли он предоставить презентацию контекст. Если контроллер представления представления не предоставляет контекст, то iOS запрашивает представление родителя представления представления контроллер. iOS выполняет поиск по иерархии диспетчера представлений пока контроллер представления не предоставит контекст представления. Если нет представления контроллер предлагает предоставить контекст, вид корневого окна контроллер предоставляет контекст представления.

Если контроллер представления возвращает true, он предоставляет представление контекст. Часть окна, покрытая контроллером представления view определяет размер представленного представления контроллера представления. Значением по умолчанию для этого свойства является false.

Ответ 2

Если вы управляете своими собственными переходами и используете popToViewController для выхода из представления, укажите контекст в searchController вместо представления

searchController.definesPresentationContext = true

или вы получите сообщение об ошибке

popToViewController:transition: called on <UINavigationController 0x7f984204f800> while an existing transition or presentation is occurring; the navigation stack will not be updated