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