2011-01-18 30 views
18

Tengo un UIViewController con UISearchBar. He reemplazado el botón Buscar por un botón Listo.iphone UISearchBar Botón hecho siempre habilitado

Sin embargo, cuando se toca en la barra de búsqueda, el botón Hecho se desactiva inicialmente. Esto ocurre hasta que uno entra a cualquier personaje.

Lo que quiero hacer es tener este botón Hecho siempre habilitado, de modo que si toco sobre él puedo descartar el teclado inmediatamente.

¿Algún ayuda? sería muy apreciado.

que tengo en mi UIViewController

-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar 
{ 
    return YES; 
} 

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    [searchBar resignFirstResponder]; 
} 

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    if (searchBar.text.length == 0) 
    { 
     //[self fixOrientation]; 
     [searchBar resignFirstResponder]; 
    } 
    else 
    { 
     NSLog(@"typed"); 
    } 
} 


-(void)searchBarTextDidBeginEditing:(UISearchBar *)theSearchBar 
{ 
    NSLog(@"began"); // this executes as soon as i tap on the searchbar, so I'm guessing this is the place to put whatever solution is available 
} 

Respuesta

17

Hoy en día UISearchBar ajusta a UITextInputTraits. Simplemente puede establecer:

searchBar.enablesReturnKeyAutomatically = NO; 

ADVERTENCIA: Si bien esto compila para iOS 7.0, lo hará accidente en tiempo de ejecución. Solo funciona para> = 7.1.

Los documentos no están claros en este caso, ya que solo desde 7.1, el UISearchBar implementa el protocolo UITextInputTraits, pero no se observa desde qué versión de iOS se adoptó el protocolo.

+0

¡hermoso y simple! volvía a esta vieja pregunta ya que estoy moviendo algunas aplicaciones de oooooold a 64bits y olvidé la solución para un caso de uso específico –

0

Sobre la base de la aplicación Maps, por ejemplo, parece que el patrón debe ser contar con un botón Cancelar cerca del campo de texto para deshacerse del teclado. Dicho esto, una sugerencia podría ser tener un UIButton personalizado colocado en esa esquina que se parece al botón Hecho.

tipo de solución hacky ...

Espero que esto ayude!

+0

mmmmmjm, no convencidos de que una (la colocación de un botón en la parte superior de esa esquina). Creo que vi una vez en la web cómo se hizo, pero no he podido encontrarlo de nuevo –

+1

@AndyDunn, maaaan, después de un largo rato me di cuenta de que tu solución en realidad es la adecuada. Me disculpo por no haberlo intentado cuando lo publicaste. Lo siento a lo grande. Siempre aprecio el tiempo que otros dedican a ayudar a los demás aquí –

+0

Sí, es un patrón que se adapta a la búsqueda 'UISearchDisplayController'. Compruebe iBooks, no hay ningún botón _Cancel_ allí. –

30

Puede solucionar esto haciendo un bucle alrededor de las subvistas en UISearchBar hasta que encuentre el campo de texto. Es solo cuestión de establecer "enableReturnKeyAutomatically" en NO. Por cierto, el siguiente código también es útil para configurar el tipo de teclado.

// loop around subviews of UISearchBar 
    for (UIView *searchBarSubview in [searchBar subviews]) {  
    if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)]) {  
     @try { 
     // set style of keyboard 
     [(UITextField *)searchBarSubview setKeyboardAppearance:UIKeyboardAppearanceAlert]; 

     // always force return key to be enabled 
     [(UITextField *)searchBarSubview setEnablesReturnKeyAutomatically:NO]; 
     } 
     @catch (NSException * e) {   
     // ignore exception 
     } 
    } 
    } 
+2

¿es esto realmente tan difícil para esta cosa simple y estúpida? –

+0

La última vez que revisé, sí, lamentablemente sí lo es. – AndyDunn

+0

¿Es realmente necesario el try/catch? –

0

Una forma más simple y complicado que se acaba de poner un espacio en blanco al comenzar la edición de búsqueda

-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{ 
    //Add a blank character to hack search button enable 
    searchBar.text = @" ";} 
10

No parece que la respuesta aceptada para trabajar más, así que hizo que mi propia categoría que parece funcionar :

@implementation UISearchBar (enabler) 

- (void) alwaysEnableSearch { 
    // loop around subviews of UISearchBar 
    NSMutableSet *viewsToCheck = [NSMutableSet setWithArray:[self subviews]]; 
    while ([viewsToCheck count] > 0) { 
     UIView *searchBarSubview = [viewsToCheck anyObject]; 
     [viewsToCheck addObjectsFromArray:searchBarSubview.subviews]; 
     [viewsToCheck removeObject:searchBarSubview]; 
     if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)]) { 
      @try { 
       // always force return key to be enabled 
       [(UITextField *)searchBarSubview setEnablesReturnKeyAutomatically:NO]; 
      } 
      @catch (NSException * e) { 
       // ignore exception 
      } 
     } 
    } 
} 
+1

Fantástico. Gracias – TheMan

+2

esto funciona también (al menos en IOS 9. No estoy seguro de la otra): si ([self.searchBar respondsToSelector: NSSelectorFromString (@ "searchField")]) { UITextField * searchTextField = ((UITextField *) [ self.searchBar valueForKey: @ "searchField"]); searchTextField.enablesReturnKeyAutomatically = NO; } – codrut

2

por favor, escriba el código siguiente puede ser útil para usted :)

Este código d isplay Search Button si tienes una cadena vacía.

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar 
{ 
    [itemSearchBar setShowsCancelButton:YES]; 
    UITextField *searchBarTextField = nil; 
    for (UIView *subView in self.itemSearchBar.subviews) 
    { 
     for (UIView *sndSubView in subView.subviews) 
     { 
      if ([sndSubView isKindOfClass:[UITextField class]]) 
      { 
       searchBarTextField = (UITextField *)sndSubView; 
       break; 
      } 
     } 
    } 
    searchBarTextField.enablesReturnKeyAutomatically = NO; 
    return YES; 
} 
+0

Es más probable que se rompa nuevamente si la jerarquía de vista cambia. Recomiende usar un estilo como la respuesta de Gujamin o una función recursiva. – eselk

4

Para iOS 8 y anterior se puede utilizar

[self.searchBar setReturnKeyType:UIReturnKeyDone]; 
[self.searchBar setEnablesReturnKeyAutomatically:NO]; 
+1

me funciona bien, solo renuncio al teclado cuando el usuario hace clic en el botón Listo. Así que, esto funciona bien para mí –

0

extensión para Swift:

extension UISearchBar { 
    var textField: UITextField? { 
     return getTextField(inViews: subviews) 
    } 

    private func getTextField(inViews views: [UIView]?) -> UITextField? { 
     guard let views = views else { return nil } 

     for view in views { 
      if let textField = (view as? UITextField) ?? getTextField(inViews: view.subviews) { 
       return textField 
      } 
     } 

     return nil 
    } 
} 

Uso:

searchBar.textField?.returnKeyType = .Done 
searchBar.textField?.enablesReturnKeyAutomatically = false 
0

solución simple y fácil para iOS 10 de XCode 8.3. 3, aunque tomó algún tiempo para resolverlo :)

@IBOutlet var searchBar: UISearchBar! { 
    didSet { 
     searchBar.returnKeyType = .done 
     searchBar.enablesReturnKeyAutomatically = false 
    } 
} 

Cambia la búsqueda a Hecho. Habilita Listo sin tener que escribir nada en el campo de búsqueda. Después de eso -> searchBar.resignFirstResponder(), así:

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 
    searchBar.resignFirstResponder() 
} 
+0

gracias! 7 años tarde, pero gracias;) –

+0

:) ¿Lo descubriste eventualmente? :) Siempre habrá alguien que pueda hacer uso de él. Me alegra ayudar, ¡salud! –

Cuestiones relacionadas