vary guide for developer classes apple adaptive iphone objective-c ipad interface-builder

iphone - guide - Quitar el botón de borrar(gris x) a la derecha de UISearchBar cuando se toca el botón de cancelar



xcode constraints (11)

El problema es que UISearchBar no expone su campo de texto y administra las propiedades en el propio campo de texto. A veces, los valores de las propiedades no son lo que quieres.

Por ejemplo, en mi propia aplicación, quería que el estilo de teclado de mi barra de búsqueda usara el estilo de alerta transparente.

Mi solución fue recorrer las subvistas de la barra de búsqueda hasta que encuentre el campo de texto. Entonces deberías poder establecer la propiedad clearButtonMode , usando algo como UITextFieldViewModeWhileEditing como parámetro.

Esto debería hacer que el botón de borrar solo se muestre mientras se edita el campo de texto.

Desea hacer esto en viewDidLoad o algo temprano, por lo que está configurado antes de comenzar a usarlo (pero después de que se inicializa la barra de búsqueda).

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

Bien, para comenzar mi pregunta, aquí hay algunas pantallas del problema ya resuelto por la aplicación Spotify:

Paso 1 de Spotify: Barra de UIS estándar no en modo de edición.

Paso 1 http://i49.tinypic.com/wbtpwi.png

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

Paso 2 http://i45.tinypic.com/161kbvp.png

Paso 3 de Spotify: botón de cancelación presionado; El teclado se desliza hacia afuera y la barra de búsqueda ya no está en modo de edición. El término de búsqueda permanece y el botón gris x ahora está oculto .

Paso 3 http://i46.tinypic.com/20utv9v.png

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

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

Lo que resulta en:

Mi Paso 3: la barra de búsqueda ahora no está en modo de edición. El botón de cancelar y el teclado se han deslizado hacia afuera. El término de búsqueda permanece pero también lo hace la x gris.

Problema http://i46.tinypic.com/rlm4w5.png

Entonces, mi pregunta es la siguiente: dado que -resignFirstResponder (and -endEditing: FYI) no oculta el botón gris x cuando una barra de búsqueda tiene texto ingresado, ¿cómo se oculta uno?

Gracias de nuevo, amigos.


Estoy aprovechando las respuestas anteriores porque comencé a ver fallos en iOS 7.1 a menos que hiciera el siguiente cambio. setClearButtonMode: una llamada adicional a respondsToSelector para cada vista para asegurarme de que se pueda llamar a setClearButtonMode: . UISearchBar que se había pasado una instancia de UISearchBar , que parece cumplir con el protocolo UITextInputTraits pero aún no tiene el selector setClearButtonMode: por lo que se produjo un bloqueo. También se pasa una instancia de UISearchBarTextField y es el objeto real al que llamar setClearButtonMode:

- (void)removeClearButtonFromView:(UIView *)view { if (!view) { return; } for (UIView *subview in view.subviews) { [self removeClearButtonFromView:subview]; } if ([view conformsToProtocol:@protocol(UITextInputTraits)]) { UITextField *textView = (UITextField *)view; if ([textView respondsToSelector:@selector(setClearButtonMode:)]) { [textView setClearButtonMode:UITextFieldViewModeNever]; } } }


Hay una forma mejor que cualquiera de las respuestas aquí, y no tiene que usar API privadas o subvistas transversales para hacerlo.

UISearchBar tiene una API incorporada para hacer esto:

[UISearchBar setImage: forSearchBarIcon: estado]

La tecla de icono de la barra de búsqueda que desea es UISearchBarIconClear y desea el estado UIControlStateNormal. Luego dale una imagen clara para la imagen, y listo.

Entonces, debería verse así:

[searchBar setImage:clearImage forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal];


La respuesta aceptada no funciona en iOS7 +, aquí está la versión modificada como una extensión Swift

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)


La suya es una categoría que escribí que hace esto.

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];


Necesitas obtener el campo de texto de la barra de búsqueda

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

utilizar en - (void) searchBarTextDidBeginEditing: (UISearchBar *) método searchBar.

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


Para el icono (x) en searchBar. Puede utilizar el método de delegado a continuación.

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { searchBar.showsCancelButton = YES; }


Para expandir la respuesta de Jadariens, si nunca desea que aparezca la x gris, debe usar lo siguiente

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


Parece que iOS 7 cambió la jerarquía de vistas de UISearchBar, y el cuadro de texto está más profundo en la vista (la solución anterior no funcionó para mí). Sin embargo, la modificación de la solución anterior para recorrer toda la jerarquía funciona:

[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]; } }


Una mejor manera de hacer esto en iOS7 es:

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


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]; } } }