ios - how - UISearchController persiste después de segue
searchbar swift 3 (2)
Tengo una aplicación con UISearchController. Este elemento de la IU está completamente configurado en un código como este:
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)
Luego lo estoy agregando a la tabla TableView''s HeaderView
tableView.tableHeaderView = searchController.searchBar
Todo parece estar funcionando bien, pero cuando está activo y selecciono un elemento en mi tableView, mi aplicación pasa a otro controlador de vista con el controlador de búsqueda persistiendo en la vista. No estoy seguro de cómo es posible, ya que el controlador de búsqueda debe ser una subvista de la vista de tabla en otro controlador de vista. ¿Cómo puedo evitar que esto suceda?
Puede ocultar SearchController manualmente estableciendo la propiedad activa en false en prepareForSegue
. Agregue el código siguiente en prepareForSegue()
searchController.active = false
Alternativamente, debe agregar la siguiente línea en viewDidLoad()
para obtener el comportamiento predeterminado
definesPresentationContext = true
De la documentación para definesPresentationContext
Un valor booleano que indica si la vista de este controlador de vista está cubierta cuando el controlador de vista o uno de sus descendientes presenta un controlador de vista.
Discusión
Cuando se presenta un controlador de vista, iOS comienza con el controlador de vista de presentación y le pregunta si desea proporcionar el contexto de presentación. Si el controlador de vista que presenta no proporciona un contexto, entonces iOS pregunta al controlador de vista principal del controlador de vista que presenta. iOS busca a través de la jerarquía del controlador de vista hasta que un controlador de vista proporcione un contexto de presentación. Si ningún controlador de vista ofrece proporcionar un contexto, el controlador de vista raíz de la ventana proporciona el contexto de presentación.
Si un controlador de vista devuelve verdadero, entonces proporciona un contexto de presentación. La porción de la ventana cubierta por la vista del controlador de vista determina el tamaño de la vista del controlador de vista presentado. El valor predeterminado para esta propiedad es falso.
Si gestiona sus propias transiciones y usa popToViewController para abandonar la vista, proporcione el contexto en el SearchController en lugar de la vista
searchController.definesPresentationContext = true
o obtendrás un error
popToViewController:transition: called on <UINavigationController 0x7f984204f800> while an existing transition or presentation is occurring; the navigation stack will not be updated