UISearchController: la barra de búsqueda desaparece del contenedor al tocar.

Parece un error de iOS común, pero he probado todas las soluciones que puedo encontrar y no he visto resultados.

Estoy creando un UISearchController y lo agrego a un contenedor UIView como este:

 self.searchController = [[SearchController alloc] initWithSearchResultsController:nil]; self.searchController.searchResultsUpdater = self; self.searchController.searchBar.delegate = self; [self.searchBarWrapper addSubview:self.searchController.searchBar]; [self.searchController.searchBar sizeToFit]; 

El problema es que cada vez que se toca la barra de búsqueda, el keyboard aparece, pero desaparece toda la barra de búsqueda.

Miré estas publicaciones:

  • Mi UISearchBar en UISearchController desaparece cuando comienzo a search. ¿Por qué?
  • iOS 9 searchBar desaparece de la vista de encabezado de tabla cuando UISearchController está activo
  • UISearchController searchBar desaparece onclick primero
  • Desapareciendo UISearchController en un TableViewController que está en un UINavigationController
  • UITableView desaparece cuando UISearchController está activo y se selecciona una nueva pestaña
  • La barra de búsqueda desaparece después de tocarla
  • UISearchController searchBar en tableHeaderView animando fuera de la pantalla
  • desaparece la barra de búsqueda en ios UIsearchcontroller
  • La barra de búsqueda desapareció de la vista al escribir

y probé todas las soluciones, agregando finalmente este código de initialization:

 self.searchController.hidesNavigationBarDuringPresentation = NO; self.definesPresentationContext = NO; self.navigationController.definesPresentationContext = YES; self.navigationController.extendedLayoutIncludesOpaqueBars = YES; self.extendedLayoutIncludesOpaqueBars = YES; 

y estas funciones delegadas

 - (void)willPresentSearchController:(UISearchController *)searchController { // definitely runs, if I put a breakpoint here it stops self.navigationController.navigationBar.translucent = YES; [self.searchBarWrapper addSubview:self.searchController.searchBar]; searchController.searchResultsController.view.hidden = NO; } -(void)willDismissSearchController:(UISearchController *)searchController{ self.navigationController.navigationBar.translucent = NO; searchController.searchResultsController.view.hidden = NO; } 

Pero la barra de búsqueda aún desaparece cuando se toca. ¿Qué más puedo probar?

Creo que la diferencia entre mi código y el rest de las publicaciones es que estoy usando un UIViewController creado mediante progtwigción sin un XIB. Hay una vista secundaria UITableView , pero no interactúa directamente con la barra de búsqueda. No hay UINavigationBar , la barra de búsqueda está en la parte superior de la vista.

ACTUALIZAR:

Esta es mi jerarquía de vista en relación con la barra de búsqueda:

 - UIViewController - UIView - UIScrollView - UIViewController - UIView - UISearchBar 

Hay un par de cosas que sugeriría.

  1. en viewDidLoad

     // after creating the searchController add self.mySearchController.active = YES; // also add this for the search bar [self.mySearchController.searchBar setAutoresizingMask: UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight]; 

Configuré una aplicación de testing simple. Se agregó una UIView a la parte superior (esta será la searchBarWrapper). Parte superior limitada, delantera, trasera y le dio una altura fija. Se agregó un tableView debajo de eso, con un prototypeCell y lo restringió Top, Leading, Trailing, Bottom — simple, simple, nada fuera de lo normal. Todo funciona bien.

Puedo publicar todo el viewControllerClass si lo necesitas.

Tengo exactamente el mismo problema. Lo que me solucionó fue agregar anclajes a la barra de búsquedaBarWrapper, luego agregarlos nuevamente en viewDidLayoutSubviews. Básicamente tuve que agregarlos dos veces:

 @IBOutlet weak var searchBarWrapper: UIView! fileprivate var searchController: UISearchController! //MARK:- View Controller Lifecycle override func viewDidLoad() { super.viewDidLoad() setSearchController() } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() positionSearchControllerInWrapperView() } //MARK:- Custom Funcs fileprivate func setSearchController(){ searchController = UISearchController(searchResultsController: nil) searchController.delegate = self searchController.searchBar.delegate = self searchController.searchResultsUpdater = self searchController.searchBar.showsCancelButton = false searchController.searchBar.placeholder = "Search man..." searchController.searchBar.returnKeyType = .done searchController.dimsBackgroundDuringPresentation = false searchController.hidesNavigationBarDuringPresentation = false searchController.searchBar.endEditing(true) searchController.searchBar.sizeToFit() definesPresentationContext = true navigationItem.hidesBackButton = true positionSearchControllerInWrapperView() } //this gets called TWICE fileprivate func positionSearchControllerInWrapperView(){ searchBarWrapper.addSubview(searchController.searchBar) searchController.searchBar.translatesAutoresizingMaskIntoConstraints = false searchController.searchBar.leftAnchor.constraint(equalTo: searchBarWrapper.leftAnchor).isActive = true searchController.searchBar.rightAnchor.constraint(equalTo: searchBarWrapper.rightAnchor).isActive = true searchController.searchBar.topAnchor.constraint(equalTo: searchBarWrapper.topAnchor).isActive = true searchController.searchBar.bottomAnchor.constraint(equalTo: searchBarWrapper.bottomAnchor).isActive = true }