2011-05-09 26 views
6

Mi aplicación tiene una barra de búsqueda para buscar registros desde la vista de tabla, que está poblada por sqlite DB. Mi problema es que cuando se abre la vista, el botón "cancelar" no está habilitado y tampoco puedo tocarlo, solo como una imagen. Está ahí pero no hay ninguna acción con eso. cuando hacemos clic en el texto de la barra de búsqueda, el botón cancelar se cambiará a "hecho", se habilitará uno. así que aquí es mi códigoEl botón Cancelar de la barra de búsqueda no funciona

este es mi punto de vista barra de búsqueda, ver esto cancela button.It no está activado

this is my search bar view.see that cancel button.It is not enabled

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar 
{ 
    //[newSearchBar setShowsCancelButton:YES animated:YES]; 


    newSearchBar.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters; 

    NSLog(@"search begin edit") ; 

    //searchString = searchBar.text; 

    //NSLog(@"print did edit searchstring : %@", searchString) ; 

    for(UIView *view in [searchBar subviews])  
    { 

     //shareItemId =newSearchBar.text; 

     if([view isKindOfClass:[NSClassFromString(@"UINavigationButton") class]]) { 
      [(UIBarItem *)view setTitle:@"Done"]; 

     } 
     } 

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar 
{ 
    NSLog(@"searchBarTextDidEndEditing:"); 


    [searchBar resignFirstResponder]; 
    //[self dismissModalViewControllerAnimated:YES]; 
} 

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    NSLog(@"searchBarSearchButtonClicked"); 


    searchString = searchBar.text; 
    NSLog(@"search %@", searchBar.text); 
    [newSearchBar setShowsCancelButton:NO animated:YES]; 

    [searchBar resignFirstResponder]; 
    //[self dismissModalViewControllerAnimated:YES]; 
} 

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar 

{ 
    NSLog(@" searchBarCancelButtonClicked"); 


    [searchBar resignFirstResponder]; 

    shareItemName =newSearchBar.text; 

    [self dismissModalViewControllerAnimated:YES]; 

} 

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar { 

    NSLog(@"searchBarShouldBeginEditing"); 


    [newSearchBar setShowsCancelButton:YES animated:YES]; 
    return YES; 
} 

Estos son mis delegados para que

Por favor marque mi código y dame la respuesta. Necesito activar el botón "Cancelar" cuando se carga la vista y acción será volver a la vista anterior

necesito como esto

enter image description here

Porque, ¿cómo puedo añadir una otra cancelar botón en emocionante cancelar botón.so que puedo habilitar that.please darme todos los detalles

+0

es el método 'searchBarCancelButtonClicked' llama? – visakh7

+1

@ 7KV7 - ¿Cómo se puede llamar si el botón está deshabilitado? Supongo que el comportamiento de UISearchBar es deshabilitar el botón cancelar cuando el campo de texto de búsqueda no es el primero en responder. –

+0

Podría forzarlo manualmente como se describe en http://stackoverflow.com/questions/4348351/uisearchbar-disable-auto-disable-of-cancel-button/4349003#4349003. – Palimondo

Respuesta

4

Supongo que Apple hizo el UISearchBar de una manera que el botón cancelar está deshabilitado si el campo de texto de búsqueda está vacío o no primero respondedor

Esto tiene sentido porque no debe usar el botón "Cancelar" para otro fin que no sea cancelar realmente la búsqueda. y dado que no hay búsqueda para cancelar, el botón está deshabilitado.

Si aún desea que el botón se activa inmediatamente cuando se presenta la vista, puede llamar al viewWillAppear: a [mySearchBar becomeFirstResponder];

Esto hará que el teclado a aparecer y se activará el botón. Y luego, si el usuario pulsa cancelar puede interceptarlo para volver a la vista anterior. (No estoy seguro si a Apple le gustará este comportamiento).

Código de ejemplo:

-(void) viewWillAppear : (BOOL) animated 
{ 
    [super viewWillAppear:animated]; 
    // Make keyboard pop and enable the "Cancel" button. 
    [self.mySearchBar becomeFirstResponder]; 
} 
+0

No funciona ... No sé por qué. Creo que no es posible y no quiero arrancar el teclado inicialmente antes de hacer clic en el texto de la etiqueta de la barra de búsqueda ... porque la búsqueda predictiva está habilitada en la tabla al hacer clic en la barra de búsqueda solo texto de etiqueta necesito teclado pull up – Ramz

+0

Definitivamente es posible porque lo intenté y funcionó. Pero si no quieres que aparezca el teclado, no veo otra opción que no sea hacer tu propia "Barra de Búsqueda". solo un campo de texto con un botón cerca y todo listo. –

6

Es necesario configurar el UISearchDisplayController a estar activo, así:

[mySearchDisplayController setActive:YES animated:YES]; 

o más simplemente:

mySearchDisplayController.active = YES; 
+0

¿Causará el mismo efecto convertirse en el primer respondedor? significa que el teclado aparecerá? –

+0

No, no lo creo, ser el primero en responder es lo que controla el teclado. – Rayfleck

3

Esto es lo que hice para siempre habilite el botón cancelar, incluso cuando el campo de búsqueda no sea el primero en responder.

Voy a llamar a este método siempre que llame resignFirstResponder en el campo de búsqueda

- (void)enableCancelButton { 
    for (UIView *view in self.searchBar.subviews) { 
     if ([view isKindOfClass:[UIButton class]]) { 
      [(UIButton *)view setEnabled:YES]; 
     } 
    } 
} 

Esto funciona, pero no estoy seguro de si se va a pasar la verificación App Store sin embargo, a fin de utilizarlo en su propio riesgo . Además, esto probablemente solo funcione si el botón cancelar es el único botón que está utilizando con el campo de búsqueda.

+3

por qué esto no pasa la verificación de la tienda de aplicaciones, lo que estás usando son todas las API públicas. – fatih

+0

Esta técnica ya no parece funcionar, ya que self.searchBar.subviews no tiene ningún UIButton. Acabo de probar/probarlo en iOS 8.x. – Mustafa

0

Esto funciona para volver a activar el botón de cancelación a partir del IOS 8:

private func enableButtonsInSubviews(view: UIView) { 
    if let view = view as? UIButton { 
     view.enabled = true 
    } 

    for subview in view.subviews { 
     enableButtonsInSubviews(subview) 
    } 
} 
Cuestiones relacionadas