A la derecha, para comenzar mi pregunta, he aquí algunos screenies de que el problema ya resuelto por la app de Spotify:

De Spotify Paso 1: Estándar UISearchBar no en el modo de edición.

Quitar botón para borrar (gris x) a la derecha de UISearchBar cuando el botón cancelar aprovechado

De Spotify Paso 2: UISearchBar ahora en el modo de edición. Término de búsqueda introducido. Botón cancelar se desliza desde la derecha, y el botón de borrar (gris x) aparece.

Quitar botón para borrar (gris x) a la derecha de UISearchBar cuando el botón cancelar aprovechado

De Spotify Paso 3: Cancelar pulsado el botón; el teclado se desliza hacia fuera y la barra de búsqueda ya no está en el modo de edición. Término de búsqueda de los restos y la gris botón x que ahora se oculta.

Quitar botón para borrar (gris x) a la derecha de UISearchBar cuando el botón cancelar aprovechado

En la actualidad, el código siguiente se dispara cuando mi cancelar se pulsa el botón:

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    [searchBar resignFirstResponder];
    [searchBar setShowsCancelButton:NO animated:YES];
}

Que se traduce en:

Mi Paso 3: barra de Búsqueda ahora no en el modo de edición. Botón cancelar y el teclado se ha deslizado fuera. Término de búsqueda sigue siendo, pero también lo hace el gris x.

Quitar botón para borrar (gris x) a la derecha de UISearchBar cuando el botón cancelar aprovechado

Así, mi pregunta es la siguiente: dado que -resignFirstResponder (y -endEditing:, FYI) ¿no ocultar el gris botón x cuando una barra de búsqueda que ha tenido el texto introducido en él, ¿cómo hace uno para ocultarlo?

Gracias de nuevo, amigos.

InformationsquelleAutor David Foster | 2010-06-16

11 Comentarios

  1. 29

    El problema es que UISearchBar no exponga el campo de texto, y administra las propiedades en el campo de texto en sí. A veces, los valores de las propiedades no son lo que usted desea.

    Por ejemplo, en mi propia app, yo quería que el teclado de estilo para mi barra de búsqueda a utilizar el transparente de alerta estilo.

    Mi solución fue a caminar a través de las subvistas de la barra de búsqueda hasta encontrar el campo de texto. A continuación, usted debe ser capaz de establecer el clearButtonMode de la propiedad, el uso de algo como UITextFieldViewModeWhileEditing como un parámetro.

    Esto debería hacer que el botón borrar solo se muestra mientras que el campo de texto que está editando.

    Desea hacer esto en viewDidLoad o algo temprano, por lo que se establece antes de comenzar a usarlo (pero después de la barra de búsqueda es inicializado.

    for (UIView *subview in searchBar.subviews)
    {
        if ([subview conformsToProtocol:@protocol(UITextInputTraits)])
        {
            [(UITextField *)subview setClearButtonMode:UITextFieldViewModeWhileEditing];
        }
    }
    • Saludos Jasarien, esto parece ser exactamente lo que necesita. Por desgracia, yo estoy en un error con [subview conformsToProtocol:UITextInputTraits] en el que se lee: expected expression before 'UITextInputTraits'. Qué necesito para importar o ajustarse a cualquier cosa?
    • Mi mal! Lo siento. Lo que usted necesita hacer [subview conformsToProtocol:@protocol(UITextInputTraits)]
    • Eso es todo! Usted es un genio. Gracias compañero.
    • Por CIERTO, ¿usas una aplicación para hacer esa pequeña anotación en tu captura de pantalla, (argh! ->)? Si es así, ¿qué aplicación? Parece útil 🙂
    • Por desgracia, eso era simplemente un pincel de Photoshop herramienta jobbie. A pesar de una anotación de la aplicación es una gran idea!
  2. 6

    Se parece a iOS 7 ha cambiado el punto de vista de la jerarquía de UISearchBar, y el cuadro de texto es más profunda en la vista (la solución anterior no funciona para mí). Sin embargo, la modificación de la solución anterior para recorrer toda la jerarquía de obras:

    [self configureSearchBarView:[self searchBar]];
    
    - (void)configureSearchBarView:(UIView*)view {
        for (UIView *subview in [view subviews]){
            [self configureSearchBarView:subview];
        }
        if ([view conformsToProtocol:@protocol(UITextInputTraits)]) {
            [(UITextField *)view setClearButtonMode:UITextFieldViewModeWhileEditing];
        }
    }
    • Esto puede hacerse fácilmente en una Categoría en la UISearchBar para permitir la reutilización.
    • Parece causar un accidente, al parecer hay más de una opinión que se ajusta a UITextInputTraits y que la vista no puede responder a setClearButtonMode.
    • Para evitar el bloqueo que me lo cambiaron a este: for (UIView *subview in [self.searchDisplayController.searchBar subviews]){[self configureSearchBarView:subview];} seguido por el configureSearchBarView:(UIView *)view método. Parece que en mi caso fue la barra de búsquedas en sí, que fue la causa del accidente.
  3. 6

    Estoy construyendo sobre la base de las respuestas, porque empecé a ver accidentes en iOS 7.1 a menos he hecho el siguiente cambio. He añadido una llamada adicional a la respondsToSelector para cada vista para asegurarse de que setClearButtonMode: puede ser llamado. He observado una instancia de UISearchBar que te pasó, que parece ajustarse a la UITextInputTraits protocolo aún no tiene la setClearButtonMode: selector, por lo que un accidente producido. Una instancia de UISearchBarTextField también se pasa y es el objeto real para el que se llame setClearButtonMode:.

    - (void)removeClearButtonFromView:(UIView *)ver 
    { 
    si (!vista) 
    { 
    de retorno; 
    } 
    
    para (UIView *subvista a la vista.subvistas) 
    { 
    [auto removeClearButtonFromView:subvista]; 
    } 
    
    si ([view conformsToProtocol:@protocol(UITextInputTraits)]) 
    { 
    UITextField *textView = (UITextField *)ver; 
    si ([textView respondsToSelector:@selector(setClearButtonMode:)]) 
    { 
    [textView setClearButtonMode:UITextFieldViewModeNever]; 
    } 
    } 
    } 
    
    • La mejor solución! Gracias.
    • De hecho, este funciona más suavemente con iOS 7.
  4. 4

    Una manera mejor de hacer esto en iOS7 es:

    [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setClearButtonMode:UITextFieldViewModeWhileEditing];

  5. 4

    Usted necesita para obtener el campo de texto de la Barra de Búsqueda

    UITextField *textField = [searchBar valueForKey:@"_searchField"];
    textField.clearButtonMode = UITextFieldViewModeNever;

    uso en – (void)searchBarTextDidBeginEditing:(UISearchBar *)barra de búsquedas método.

    - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
     {
    
    UITextField *textField = [searchBar valueForKey:@"_searchField"];
    textField.clearButtonMode = UITextFieldViewModeNever;
    
    
     }
  6. 3

    Para ampliar Jadariens respuesta si no desea que nunca el gris x a aparecer deberá utilizar la siguiente

    for (UIView *subview in searchBar.subviews)
    {
        if ([subview conformsToProtocol:@protocol(UITextInputTraits)])
        {
            [(UITextField *)subview setClearButtonMode:UITextFieldViewModeNever];
        }
    }
  7. 1

    Aceptado la respuesta no funciona en iOS7+, aquí está la versión modificada, como una rápida extensión de

    extension UIView {
        class func removeClearButton(svs: [UIView]) {
            for sv in svs {
                if let tv = sv as? UITextField where sv.conformsToProtocol(UITextInputTraits) {
                    tv.clearButtonMode = .Never
                    return
                } else {
                    UIView.removeClearButton(sv.subviews)
                }
            }
        }
    }

    Uso

    UIView.removeClearButton(searchBar.subviews)
  8. 0

    La suya es una categoría escribí que hace este

    Categoría

    @implementation UISearchBar (Additions)
    
    - (void)setClearButtonMode:(UITextFieldViewMode)viewMode {
        UITextField *textField = [self findTextFieldInView:self];
        [textField setClearButtonMode:viewMode];
    }
    
    - (UITextField *)findTextFieldInView:(UIView *)view {
    
        for (UIView *subview in view.subviews) {
    
            if ([subview isKindOfClass:[UITextField class]] ||
                [subview.class isSubclassOfClass:[UITextField class]]) {
    
                return (UITextField *)subview;
            }
    
            UITextField *textField = [self findTextFieldInView:subview];
    
            if (textField) {
                return textField;
            }
        }
    
        return nil;
    }
    
    @end

    Uso

    [searchBar setClearButtonMode:UITextFieldViewModeWhileEditing];
  9. 0

    Hay una manera mejor que cualquiera de las respuestas aquí, y usted no tiene que usar privado Api, o recorrer subvistas hacerlo.

    UISearchBar tiene un built-in API para hacer esto:

    [UISearchBar setImage:forSearchBarIcon:estado]

    La barra de búsquedas icono de la tecla que desea es UISearchBarIconClear, y desea que el UIControlStateNormal estado. Luego le dan una imagen clara de la imagen, y listo.

    Así, se debe tener este aspecto:

    [searchBar setImage:clearImage forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal];
  10. 0

    Para el icono (x) en la barra de búsquedas. Usted puede utilizar a continuación el método de delegado.

    - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
    {
        searchBar.showsCancelButton = YES;
    }
  11. 0
    for (UIView *subview in _search_bar.subviews)
    {
        NSLog(@"%@",subview.subviews);
    
        for (UIView *subview11 in subview.subviews)
        {
            if ([subview11 conformsToProtocol:@protocol(UITextInputTraits)])
            {
                [(UITextField *)subview11 setClearButtonMode:UITextFieldViewModeNever];
            }
        }
    
    }

Dejar respuesta

Please enter your comment!
Please enter your name here