volver puedo por para inicio home flotante desactivar control como boton atras assistive activar iphone uitextfield uisearchbar

iphone - puedo - Descartar el teclado de la barra UISearch cuando se pulsa el botón X



control por boton iphone (13)

Puede renunciar con el primer respondedor haciendo clic en el botón Cancelar como.

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar { SearchBar.showsCancelButton =NO; } - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { [SearchBar resignFirstResponder]; }

Estoy usando la barra UISearchBar (pero no el SearchDisplayController que normalmente se usa en conjunto) y me gustaría cerrar el teclado cuando presionas el botón "X".

He seguido la sugerencia de TomSwift sobre ser llamado cuando se pulsa la ''X'' y funciona muy bien. Pero renunciar al primer respondedor del campo de texto y también invocar en la instancia de UISearchBar, ambos con resignFirstResponder , no hará que el teclado desaparezca.

¿Hay alguna forma de deshacerse del teclado cuando el usuario ha pulsado el botón X?

Esto es lo que hice para obtener la notificación ''Clear'':

- (void)viewDidLoad: { for (UIView* v in searchBar.subviews) { if ( [v isKindOfClass: [UITextField class]] ) { UITextField *tf = (UITextField *)v; tf.delegate = self; break; } } }

Luego tengo mi configuración de clase para implementar tanto UISearchBarDelegate como UITextFieldDelegate.

Hacer que la clase actúe como delegado del campo de texto me permite recibir esta llamada:

- (BOOL)textFieldShouldClear:(UITextField *)textField { [textField resignFirstResponder]; [self.searchBar resignFirstResponder]; return YES; }

He intentado todo lo que puedo pensar. Lo último que intento es encontrar una manera de emitir el ''searchBarCancelButtonClicked'' que UISearchDelegate invocará en mi clase de Controlador, pero no estoy seguro de cómo podría hacerlo ya que la UISearchBar no parece tener ningún método directo para hacerlo. invocar con este nombre.


¿No deberían realizarse cambios en la interfaz de usuario en el hilo principal en lugar de usar performselector:WithObject:afterDelay: :?

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { if (searchText.length == 0) { [searchBar performSelectorOnMainThread:@selector(resignFirstResponder) withObject:nil waitUntilDone:NO]; } }



Esto funciona:

[searchBar performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0.1];


Gracias a Maxhs por la respuesta original: esta es la versión 2.2 de Swift: funciona como un encanto para mí

if searchBar.text == "" { dispatch_async(dispatch_get_main_queue(), { self.searchBar.resignFirstResponder() }) }


La respuesta de Toms me hizo pensar. Si es que la barra de búsqueda aún no es el primerResponder cuando el usuario hace clic en el botón de borrado, podemos esperar hasta que lo sea, y luego hacer que resignFirstResponder; es decir, a lo largo de las líneas de:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { [self performFilteringBySearchText: searchText]; // or whatever // The user clicked the [X] button or otherwise cleared the text. if([searchText length] == 0) { [searchBar performSelector: @selector(resignFirstResponder) withObject: nil afterDelay: 0.1]; } }

Funciona como un amuleto, y menos intrépido que el IMHO de Tom.


Otro punto de vista para un flujo de texto claro (similar a la respuesta de @TomSwift pero más claro para mí y menos complicado). Además, debo ocultar el botón Cancelar después de salir de la barra de búsqueda, implementar la búsqueda en vivo (después de cada símbolo) y cubrir la tabla antes de que el usuario complete la búsqueda.

//self.searchHoverView can cover table view //performSearchWithSearchBar: method for performing search #pragma mark - UISearchBarDelegate - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { [searchBar setShowsCancelButton:YES animated:YES]; self.searchHoverView.hidden = NO; } - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { if (searchText.length) { [self performSearchWithSearchBar:searchBar]; } else { UIButton *button; for (UIView *subView in [searchBar subviews]) { for (UIView *view in [subView subviews]) { if ([view isKindOfClass:[UIButton class]]) { button = (UIButton *)view; break; } } } if (button) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [button sendActionsForControlEvents:UIControlEventTouchUpInside]; }); } } } - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { self.searchBar.text = nil; [self.searchBar setShowsCancelButton:NO animated:YES]; [self.searchBar resignFirstResponder]; self.searchHoverView.hidden = YES; }


Tratar de evitar

- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar

método en su código podemos resolver esto


Usé una combinación de la respuesta de @ radiospiel y también la respuesta que @Tozar vinculó a:

@interface SearchViewController : UIViewController <UISearchBarDelegate> { // all of our ivar declarations go here... BOOL shouldBeginEditing; .... } ... @end @implementation SearchViewController ... - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { ... shouldBeginEditing = YES; } } ... - (void) searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText { // TODO - dynamically update the search results here, if we choose to do that. if (![searchBar isFirstResponder]) { // The user clicked the [X] button while the keyboard was hidden shouldBeginEditing = NO; } else if ([searchText length] == 0) { // The user clicked the [X] button or otherwise cleared the text. [theSearchBar performSelector: @selector(resignFirstResponder) withObject: nil afterDelay: 0.1]; } } - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)bar { // reset the shouldBeginEditing BOOL ivar to YES, but first take its value and use it to return it from the method call BOOL boolToReturn = shouldBeginEditing; shouldBeginEditing = YES; return boolToReturn; } @end


Versión Swift 2:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { // The user clicked the [X] button or otherwise cleared the text. if (searchText.characters.count == 0) { searchBar.performSelector("resignFirstResponder", withObject: nil, afterDelay: 0.1) } }


Actualizado para SWIFT 3:

Supongamos que el usuario ha ingresado una cadena en el campo de búsqueda y hace clic en x el siguiente código funciona para ocultar el teclado cuando se presiona x

`

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { if searchBar.text == nil || searchBar.text == "" { searchBar.perform(#selector(self.resignFirstResponder), with: nil, afterDelay: 0.1) } }

`


Actualizar:

Bueno, esto es un hack total, pero pude hacerlo funcionar. Básicamente el código invoca el controlador para el botón de cancelar. Para hacerlo funcionar, tuve que invocar el selector con un retraso, y no estoy seguro de por qué tenía que ser así. Además, tuve que escribir un elemento de acceso para el botón de cancelación tal como lo hizo para el campo de texto.

Una vez más, esto es un hack total. No estoy seguro de que lo haría yo mismo en una aplicación.

// this in the context of the search bar - (UIButton*) cancelButton { for (UIView* v in self.subviews) { if ( [v isKindOfClass: [UIButton class]] ) return (UIButton*)v; } return nil; } // this is the textField delegate callback - (BOOL)textFieldShouldClear:(UITextField *)textField { [textField resignFirstResponder]; UIButton* cb = _searchBar.cancelButton; NSObject* target = [[cb allTargets] anyObject]; NSArray* actions = [cb actionsForTarget: target forControlEvent:UIControlEventTouchUpInside]; NSString* selectorName = [actions objectAtIndex:0]; SEL selector = NSSelectorFromString( selectorName ); [target performSelector: selector withObject: cb afterDelay: 0.1]; return YES; }

Respuesta original:

¿Cómo se obtiene el botón "X" para mostrar en primer lugar? En mi caso de prueba no lo veo mostrando ...

Intente hacer un resignFirstResponder en la barra de búsqueda, no en el campo de texto.


EDITAR: En realidad, a continuación se rompe el delegado que está conectado a UISearchBar. Solo subclase UISearchBar y sobrescriba el método Delegado de UITextField.

===========================

Tuve que hacer esto para acceder a la UITextView

for (UIButton* v in [self.searchBar.subviews[0] subviews]) { if ( [v isKindOfClass: [UITextField class]] ) { UITextField *tf = (UITextField *)v; tf.delegate = self; break; } }