example delegate custom bar ios swift uisearchbar

ios - delegate - ¿Cómo salir de la búsqueda haciendo clic en el botón Cancelar?



uisearchbar swift 4 (10)

Cuando searchBar el botón de cancelar, la searchBar ve como si tuvieras algo nuevo que buscar, por eso, si pones resignFirstResponder() en el botón de cancelButton , no funcionará, porque después de esto se llamará didBeginText .

Entonces puse una condición en didBeginText , así que cuando la cadena en la búsqueda tenga menos o 0 caracteres, renunciará al primer respondedor. Así como esto:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { if searchText.characters.count < 1 { searchBar.resignFirstResponder() } }

Es un enfoque fácil y también funciona. ¡Atentamente!

Tengo una barra de búsqueda con el botón de cancelar. Pero cuando hago clic en el botón Cancelar, no se cierra la barra de búsqueda. ¿Cómo puedo hacer que al hacer clic en Cancelar, la barra de búsqueda vuelva al primer estado?

Si tiene alguna pregunta, pregúnteme, por favor.


Muy rápido y sencillo. Solo cumpla con el protocolo UISearchBarDelegate y luego implemente esta función en su clase:

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { searchBar.resignFirstResponder() }

resign significa que va a renunciar

FirstResponder es el foco de la vista

En conclusión, esto quita el foco de la barra de búsqueda y la cancela.


Necesitas implementar el UISearchBarDelegate .

El protocolo UISearchBarDelegate define los métodos opcionales que implementa para que un control UISearchBar funcional. Un objeto UISearchBar proporciona la interfaz de usuario para un campo de búsqueda en una barra, pero es responsabilidad de la aplicación implementar las acciones cuando se pulsan los botones. Como mínimo, el delegate debe realizar la búsqueda real cuando se ingresa texto en el campo de textField . Lee esto

En objetivo c

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { [self.searchDisplayController setActive:NO animated:YES]; }

En Swift:

func searchBarCancelButtonClicked(searchBar: UISearchBar) { self.searchDisplayController.setActive(false, animated: true) }


Necesitas implementar el UISearchBarDelegate:

class ViewController: UIViewController, UISearchBarDelegate { @IBOutlet weak var searchBar: UISearchBar!

Establecer el delegado de la barra de búsqueda a auto

override func viewDidLoad() { super.viewDidLoad() searchBar.showsCancelButton = true searchBar.delegate = self

y luego implemente la función de delegado butCancelSearchAction para hacer lo que sea necesario para cancelar la acción de búsqueda y restablecer el texto de búsqueda:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { // Do some search stuff } func searchBarCancelButtonClicked(searchBar: UISearchBar) { // Stop doing the search stuff // and clear the text in the search bar searchBar.text = "" // Hide the cancel button searchBar.showsCancelButton = false // You could also change the position, frame etc of the searchBar }


Para solución Objective-C

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { if(@available(iOS 11.0, *)){ [self.navigationController.navigationItem.searchController.searchBar resignFirstResponder]; } // reload your table or whatever you want. // searchController is available after the iOS 11, so it will be good to use @available check }


Prueba esto:

searchController.active = false


Swift 3

func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool { searchBar.showsCancelButton = true return true } func searchBarTextDidEndEditing(_ searchBar: UISearchBar) { self.searchBar.endEditing(true) searchBar.resignFirstResponder() } func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { searchBar.resignFirstResponder() } func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { self.searchBar.endEditing(true) searchBar.showsCancelButton = false searchBar.resignFirstResponder() } The Cancel button appears only when the user start entering characters in the field.


También me he encontrado con este problema, en mi caso, después de buscar cualquier elemento de la vista de tabla, hacer clic en uno de los resultados, se abre la vista de detalles pero la barra de búsqueda no desaparece. Utilizo la respuesta de Nicat con unos pequeños cambios, aquí está mi versión:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { searchController.isActive = false self.searchBarCancelButtonClicked(searchController.searchBar) ... }


Tratar. Funciona bien.

class MyViewController: UIViewController, UISearchBarDelegate { func searchBarTextDidBeginEditing(_searchBar: UISearchBar) { searchBar.setShowsCancelButton(true, animated: true) //write other necessary statements } func searchBarCancelButtonClicked(_searchBar: UISearchBar) { searchBar.text = nil searchBar.setShowsCancelButton(false, animated: true) // Remove focus from the search bar. searchBar.endEditing(true) } }


class MyController: UIViewController, UISearchBarDelegate { // Called when search bar obtains focus. I.e., user taps // on the search bar to enter text. func searchBarTextDidBeginEditing(searchBar: UISearchBar) { searchBar.showsCancelButton = true } func searchBarCancelButtonClicked(searchBar: UISearchBar) { searchBar.text = nil searchBar.showsCancelButton = false // Remove focus from the search bar. searchBar.endEditing(true) // Perform any necessary work. E.g., repopulating a table view // if the search bar performs filtering. } }