iphone UISearchBar botón Hecho siempre activado

Tengo un UIViewController con un UISearchBar. He sustituido el Botón de Búsqueda por un botón Hecho.

Sin embargo, cuando uno de los toques en la barra de búsquedas, el botón Hecho es inicialmente desactivado. Esto ocurre hasta que uno entra en cualquier carácter.

Lo que quiero hacer es tener este botón Hecho siempre habilitado, que si me toca me puede descartar inmediatamente el teclado.

Alguna ayuda? sería muy apreciada.

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  
}  
InformationsquelleAutor David Homes | 2011-01-18

10 Kommentare

  1. 22

    Hoy en día UISearchBar se ajusta a UITextInputTraits. Usted puede simplemente establecer:

    searchBar.enablesReturnKeyAutomatically = NO;

    ADVERTENCIA: Mientras este se compila para iOS 7.0, se accidente en tiempo de ejecución. Sólo funciona para los >=7.1.

    Los documentos no están claros en este, ya que sólo desde 7.1, la UISearchBar implementa la UITextInputTraits protocolo, pero no es notable puesto que la versión de iOS el protocolo sea adoptado.

    • hermosa & simple! estaba volviendo a esta antigua pregunta ya que me estoy moviendo algunos oooooold aplicaciones de 64 bits y se olvidó de la solución para un caso de uso específico
  2. 30

    Usted puede conseguir alrededor de esto en un bucle alrededor de la subvistas en el UISearchBar hasta encontrar el campo de texto. Su entonces sólo una cuestión de configuración «enablesReturnKeyAutomatically» a NO. Por cierto el siguiente código también es útil para establecer 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
          }
        }
      }
    • es realmente difícil para esta sencilla estupidez?
    • La última vez que revisé, sí, por desgracia lo es.
    • Es el try/catch realmente necesario?
    • Esto no parece funcionar. Por favor, considere la posibilidad de la categoría que he publicado.
    • Como se ha dicho, esto no funciona con las nuevas versiones de SDK. Motivo: Esto sólo comprueba las subvistas, no subvistas de subvistas, y la vista hiearchy cambiado en algún punto entre SDK/iOS 6 y 8.
  3. 10

    Aceptado la respuesta no parece funcionar, así que he hecho mi propia categoría que parece de trabajo:

    @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
                }
            }
        }
    }
    • Fantástico. Gracias
    • esto también funciona (al menos en ios 9. no estoy seguro acerca de los otros): si ([auto.barra de búsquedas respondsToSelector:NSSelectorFromString(@»searchField»)]) { UITextField searchTextField = ((UITextField)[auto.barra de búsquedas valueForKey:@»searchField»]); searchTextField.enablesReturnKeyAutomatically = NO; }
  4. 4

    Para iOS 8 y por encima de usted puede utilizar

    [self.searchBar setReturnKeyType:UIReturnKeyDone];
    [self.searchBar setEnablesReturnKeyAutomatically:NO];
    • funciona muy bien para mí ,me acaba de dimitir el teclado cuando el usuario haga clic en el botón Hecho .Así, este trabajo muy bien para mí
  5. 2

    Por favor escribir código siguiente puede ser útil para usted 🙂

    Este código de visualización Botón de Búsqueda si usted tiene 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;
    }
    • Esto es más probable que se rompa de nuevo, si el punto de vista de la jerarquía de los cambios. Recomendamos el uso de un estilo como Gujamin de la respuesta o de una función recursiva.
  6. 2

    Simple y fácil solución para iOS 10 en XCode 8.3.3, a pesar de que tomó un poco de tiempo para averiguarlo 🙂

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

    Cambios de Búsqueda a Hacer. Permite Hacer sin tener que escribir nada en el campo de búsqueda. Después de que -> barra de búsquedas.resignFirstResponder() así:

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        searchBar.resignFirstResponder()
    }
    • gracias! 7 años de retraso, pero gracias 😉
    • 🙂 ¿U averiguar el tiempo? 🙂 Siempre habrá alguien que pueda hacer uso de ella. Me encantaría ayudar, saludos!
  7. 0

    Basado en la aplicación de Mapas, por ejemplo, parece que el patrón debe tener un botón de cancelar cerca de la textfield para deshacerse de el teclado. Con eso dicho, una sugerencia podría ser la costumbre de tener un UIButton colocado justo en esa esquina que se ve igual que el botón Hecho.

    Tipo de un hacky solución…

    Espero que esto ayude!

    • mmmmmjm, no convencido de que uno (la colocación de un botón en la parte superior de la esquina). Creo que vi una vez en la web de cómo se ha hecho, pero no he sido capaz de encontrarlo de nuevo
    • maaaan, después de un looooong tiempo me di cuenta de que la solución en realidad es el adecuado! Me disculpo por no haberlo intentado al publicado. Lo siento mucho. Yo siempre agradezco el tiempo que otros ponen en ayudar a los demás aquí
    • Sí, es un patrón que se adapte a UISearchDisplayController-como la búsqueda. Verificación de iBooks, no hay Cancelar botón de allí.
  8. 0

    Una manera más simple y complicado es poner un espacio en blanco al principio de edición de búsqueda

    -(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
        //Add a blank character to hack search button enable
        searchBar.text = @" ";}
  9. 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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea