bar objective-c ios cocoa-touch uisearchbar uisearchdisplaycontroller

objective-c - search bar swift 4



Ocultar el botón Cancelar de UISearchBar (10)

Tengo un UISearchDisplayController y UISearchBar conectado a mi ViewController a través de Outlets desde mi plumilla.

Me gustaría ocultar el botón de cancelar para que el usuario nunca lo vea. El problema es que el siguiente código oculta el botón, pero solo después de mostrarlo al usuario durante un milisegundo (por ejemplo, parpadea en el simulador y el dispositivo y luego desaparece de la vista).

- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller { controller.searchBar.showsCancelButton = NO; }

¿Hay una mejor manera de ocultarlo?


Basándome en los problemas que he tenido antes, intente configurarlo en:

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller

No sé cómo hacer esta pregunta en su pregunta, lo siento si esto está fuera de lugar.


Después de que UISearchDisplayController se haya desaprobado en iOS8, Apple le da una presentación de búsqueda de manejo a UISearchControllerDelegate.

para que pueda anular searchBar para ocultar el botón Cancelar, como a continuación:

- (void)didPresentSearchController:(UISearchController *)searchController { [searchController.searchBar setShowsCancelButton:NO]; }

Si necesita el botón Cancelar oculto del estado inactivo, necesita configurar searchBar en init:

search = [[UISearchController alloc] initWithSearchResultsController:nil]; [search.searchBar setShowsCancelButton:NO];


Esto parece ser un error dentro de Xcode. Envié este error al sitio de informes de errores de Apple, y siguieron pidiendo más códigos de muestra y casos de uso.

Gracias a todos por su intento de resolver este problema.


Si el botón de cancelar aparece cuando se edita el campo de búsqueda de la barra de búsqueda, puede hacer lo siguiente; subclase la barra de búsqueda y UITextFieldDelegate que implemente el protocolo UITextFieldDelegate :

@interface CustomAlignedSearchBar : UISearchBar<UITextFieldDelegate>

Luego implementa textFieldDidBeginEditing: y haz algo como:

- (void)textFieldDidBeginEditing:(UITextField *)textField{ [self setShowsCancelButton:self.cancelButtonShown animated:NO]; }

Esto asegurará que el botón de cancelar no se mostrará.


Similar a la respuesta de Nimrod, también puede subclase UISearchDisplayController e implementar el setActive:animated: ::

- (void)setActive:(BOOL)visible animated:(BOOL)animated { [super setActive:visible animated:animated]; self.searchBar.showsCancelButton = NO; }


Tuve el mismo problema, pero lo arreglé de una manera diferente.

Para aquellos que no pueden o no quieren subclase UISearchDisplayController , solucioné el problema agregando un oyente en UIKeyboardWillShowNotification , y configurando [self setShowsCancelButton:NO animated:NO] allí.

A la vista, viewWillAppear: :

// Add keyboard observer: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillAppear:) name:UIKeyboardWillShowNotification object:nil];

Entonces creas:

- (void)keyboardWillAppear:(NSNotification *)notification { [YOUR-SEARCHBAR-HERE setShowsCancelButton:NO animated:NO]; }

No te olvides de añadir,

[[NSNotificationCenter defaultCenter] removeObserver:self];

a la viewWillDisappear: a viewWillDisappear:

¡Espero que esto ayude!


Tuvo este problema al usar la UISearchBar con UISearchController . Estoy usando mi propio botón de cancelar, ya que el botón de cancelar no se mostraba en el iPad con showsCancelButton = YES , ahora no se ocultará en el iPhone con showsCancelButton = NO !

Lo siguiente funcionó para mí.

Establecer el delegado, y el valor inicial:

- (void)viewDidLoad { // ... self.searchController.searchBar.showsCancelButton = NO; self.searchController.searchBar.delegate = self; }

Restablecer showsCancelButton a NO 0.1s después de que la barra de texto comience a editar.

#pragma mark - UISearchBarDelegate - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ self.searchController.searchBar.showsCancelButton = NO; }); }


UISearchBar ocultar el botón "Cancelar" subclasificando UISearchBar y anulando este método:

-(void)layoutSubviews{ [super layoutSubviews]; [self setShowsCancelButton:NO animated:NO]; }


Si quieres evitar la subclasificación, implementa

searchController.searchBar.showsCancelButton = false;

en estos dos métodos de delegado (No olvide asignar delegados):

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController - (void)didPresentSearchController:(UISearchController *)searchController

El primero se llama cada vez que actualice searchBar (el botón Cancelar está visible de forma predeterminada) y el segundo es para la primera activación de searchBar.


class CustomSearchBar: UISearchBar { override func setShowsCancelButton(showsCancelButton: Bool, animated: Bool) { super.setShowsCancelButton(false, animated: false) } } class CustomSearchController: UISearchController, UISearchBarDelegate { lazy var _searchBar: CustomSearchBar = { [unowned self] in let customSearchBar = CustomSearchBar(frame: CGRectZero) customSearchBar.delegate = self return customSearchBar }() override var searchBar: UISearchBar { get { return _searchBar } } }