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.
}
}