example bar ios uisearchcontroller

ios - example - uisearchbar swift 4



Mostrar URsearchController SearchResultsController en SearchBar Tap (4)

Estoy usando UISearchController no UISearchDisplayController, y quiero mostrar SearchResultController en SearchBar Toque de inmediato. Ahora mismo se muestra así (cuando toco en la barra de búsqueda):


Creo que este método es mejor, tenga cuidado cuando searchBar esté vacío, la precarga tableview desaparecerá nuevamente.

UISearchBarDelegate

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { if searchText.isEmpty { dispatch_async(dispatch_get_main_queue()) { self.searchController.searchResultsController?.view.hidden = false } } } func searchBarTextDidBeginEditing(searchBar: UISearchBar) { dispatch_async(dispatch_get_main_queue()) { self.searchController.searchResultsController?.view.hidden = false } }

UISearchControllerDelegate

func willPresentSearchController(searchController: UISearchController) { dispatch_async(dispatch_get_main_queue()) { self.searchController.searchResultsController?.view.hidden = false } }


Encontré que las otras respuestas tenían parpadeo debido al uso de dispatch_async . Usaron esto para que sus cambios se aplicaran después de que se hubiera completado el comportamiento interno del controlador de búsqueda, pero esto deja un par de marcos donde se aplica el comportamiento interno antes de que se anule. El uso de KVO me permitió anular inmediatamente el comportamiento interno sin ningún parpadeo.

También encontré que las otras respuestas no mantenían el controlador de resultados de búsqueda visible cuando un usuario pulsó el botón para borrar el contenido de la barra de búsqueda, lo que me parece incorrecto.

- (void) viewDidLoad { ... self.searchController.delegate = self; [self.searchController.searchResultsController.view addObserver:self forKeyPath:@"hidden" options:0 context:NULL]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ( object == self.searchController.searchResultsController.view && [keyPath isEqualToString:@"hidden"] && self.searchController.searchResultsController.view.hidden && self.searchController.searchBar.isFirstResponder ) { self.searchController.searchResultsController.view.hidden = NO; } } - (void) willPresentSearchController:(UISearchController *)searchController { searchController.searchResultsController.view.hidden = NO; } - (void) searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { if ( searchText.length == 0 ) self.searchController.searchResultsController.view.hidden = NO; } - (void) searchBarTextDidEndEditing:(UISearchBar *)searchBar { self.searchController.searchResultsController.view.hidden = YES; }


La respuesta de Chris Vasselli es la forma más limpia de implementar esto.

Aquí está en Swift 3

override func viewDidLoad() { super.viewDidLoad() searchController.delegate = self self.searchController.searchResultsController?.view.addObserver(self, forKeyPath: "hidden", options: [], context: nil) } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if let someView: UIView = object as! UIView? { if (someView == self.searchController.searchResultsController?.view && (keyPath == "hidden") && (searchController.searchResultsController?.view.isHidden)! && searchController.searchBar.isFirstResponder) { searchController.searchResultsController?.view.isHidden = false } } } func willPresentSearchController(_ searchController: UISearchController) { searchController.searchResultsController?.view.isHidden = false } func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { if (searchText.characters.count == 0) { searchController.searchResultsController?.view.isHidden = false } } func searchBarTextDidEndEditing(_ searchBar: UISearchBar) { searchController.searchResultsController?.view.isHidden = true }


Cuando los resultados están vacíos, el UISearchController de viewController aún está oculto. Es por eso que tenemos que UISearchControllerDelegate con UISearchControllerDelegate ''s willPresentSearchController:

Después de inicializar self.searchController haga que su ViewController se ajuste a `UISearchControllerDelegate:

self.searchController.delegate = self;

Implemente willPresentSearchController: en su ViewController:

- (void)willPresentSearchController:(UISearchController *)searchController { dispatch_async(dispatch_get_main_queue(), ^{ searchController.searchResultsController.view.hidden = NO; }); }

El envío asíncrono es necesario, ya que de lo contrario quedará anulado por el comportamiento interno. Usted podría ir elegante aquí y usar una animación para hacer que la vista de la tabla aparezca.

Además, implemente didPresentSearchController: para la cordura:

- (void)didPresentSearchController:(UISearchController *)searchController { searchController.searchResultsController.view.hidden = NO; }