Agregue UISearchBar a UINavigationBar con UIBarButtonItem

En mi aplicación, solía tener una barra de búsqueda en la vista de encabezado de mi vista de tabla. Sin embargo, agregué un elemento del button de la barra de búsqueda, y cuando un usuario lo toca, quiero que una barra de búsqueda se anime en la barra de navigation, y el usuario debería poder search. Es como la barra de búsqueda en la aplicación Twitter iOS. aquí está el código para mi UISearchController:

self.searchController = ({ let controller = UISearchController(searchResultsController: nil) controller.searchResultsUpdater = self controller.hidesNavigationBarDuringPresentation = true controller.dimsBackgroundDuringPresentation = false controller.searchBar.sizeToFit() //self.tableView.tableHeaderView = controller.searchBar self.definesPresentationContext = true controller.searchBar.returnKeyType = .Search controller.searchBar.delegate = self return controller })() 

Así es como se ve mi UINavigationBar en este momento: introduzca la descripción de la imagen aquí

¿Cómo iba a hacer esto?

Ya casi estás ahí. Necesitas hacer cuatro cosas:

  1. searchController.hidesNavigationBarDuringPresentation = false
  2. navigationItem.titleView = searchController.searchBar
  3. ocultar todos los UIBarButtonItems actuales que tiene en la barra de navigation
  4. searchController.searchBar.becomesFirstResponder ()

Es decir, usted configura su UISearchController para que no oculte la barra de navigation, ya que UISearchBar se mostrará allí.

Entonces, cuando se ejecuta su IBAction, hace algo como:

 navigationItem.hidesBackButton = true navigationItem.titleView = searchController.searchBar navigationItem.rightBarButtonItem = nil searchController.searchBar.becomeFirstResponder() 

Eso garantiza que UISearchBar usará todo el UINavigationBar cuando se convierta en el primer respondedor. También obtienes la animation UISearchBar, que hace un buen trabajo al ocultar la eliminación no animada de UIBarButtonItems.

Tendrá que implementar UISearchBarDelegate (o si prefiere UISearchControllerDelegate) para restaurar el estado original de la barra de navigation una vez que el usuario finalice la búsqueda.

Un detalle muy importante es que para que su UISearchBar sea editable en el títuloView, no se puede establecer ningún otro controller de vista con definePresentationContext = true en el momento en que se presiona el suyo.