2010-02-26 9 views
15

Tengo una configuración UISearchDisplayController con UITableViewController que está anidada dentro de UINavigationController. Cuando se realiza una selección de una celda, se activa el método UITableView'sdidSelectRowAtIndexPath, que empuja una nueva vista al controlador de navegación principal. Esta nueva vista debe tener la barra de navegación oculta en la entrada.Mantener la barra de navegación de UINavigationController oculta después de la selección de UISearchDisplayController

[[self navigationController] setNavigationBarHidden:YES animated:NO]; 

que utilizan esta línea en el método didSelectRowAtIndexPath para ocultar la barra de navegación. Esto funciona bien cuando se selecciona una fila que no utiliza el controlador de búsqueda, pero se anula al seleccionar un resultado de búsqueda. Parece que el UISearchDisplayController lo lleva a su derecha para des-ocultar la barra de navegación en algún momento después de seleccionar la fila.

Si muevo la llamada setNavigationBarHidden al método de la vista de destino viewWillAppear, los resultados son similares. Puedo hacer que funcione al colocar la llamada de ocultación en viewDidAppear, pero esto hace que un muy incómodo efecto de transición que se siente nervioso y fuera de lugar. Me gustaría que la barra de navegación ya esté oculta antes de que la nueva vista se deslice a la pantalla.

¿Alguien sabe dónde se está produciendo el desencadenamiento de la barra de navegación, y/o cualquier forma en que puedo anular este comportamiento?

+0

Lo siento, aún no he marcado una respuesta correcta; Eventualmente encontré un truco que funcionó, que probablemente sea el mismo que el siguiente, pero desde entonces he avanzado y no he mirado ese proyecto por un tiempo. Cuando tenga la oportunidad, verificaré qué método usé y actualizaré esta pregunta. – peppy

+0

¿Qué truco terminaste usando? – Sorig

Respuesta

1

topado con el mismo problema, se las arregló para conseguir que funcione sin problemas con esta fea Hack:

- (void) viewWillDisappear: (BOOL) animated 
{ 
    if (searchController_.active)  
    { 
     self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent; 
     self.navigationController.navigationBar.tintColor = nil;   
    } 

    [super viewWillDisappear: animated]; 
} 


- (void) viewWillAppear: (BOOL) animated 
{  
    if (searchController_.active)  
    { 
     self.navigationController.navigationBar.barStyle = UIBarStyleDefault; 
    } 

    [super viewWillAppear: animated]; 
} 
6

esto puede no ser la solución más elegante, pero creo que hace exactamente lo que se desea que se . Me encontré con un problema similar, y mi solución fue tener un método que oculta la barra de navegación, que se llama después de un retraso de 0 segundos de la siguiente manera.

El método que se llama es:

-(void) hideNavBar { 
    if (self.navigationController.navigationBar.hidden == NO) 
    { 
     [self.navigationController setNavigationBarHidden:YES animated:YES]; 
    } 
} 

Luego, en el método viewDidLoad, tengo los siguientes:

[self performSelector:@selector(hideNavBar) withObject:nil afterDelay:0.0]; 

Esto funciona y elimina la barra de navegación de una sola instantánea. Puede modificar el tiempo de retraso si desea la animación o para que se elimine después de un retraso. Intenté [self hideNavBar] pero eso simplemente no funcionó, por lo que me apegué a lo que tengo arriba.

Espero que esto ayude, y si alguien tiene una solución más elegante, ¡estoy interesado!

+0

Maldita sea, esto me consiguió durante la mayor parte de una hora. ¡Gracias! Solo para clairificar, debe poner esto en el controlador de vista que se está insertando en la pila de navegación. – Ben

+0

la respuesta anterior no funcionará en iOS 7 –

0

tuve el mismo problema: mi punto de vista tiene la barra de navegación oculta por defecto y aquí está la manera de mantenerlo oculto:

-(void) viewWillLayoutSubviews{ 
    if (self.navigationController.navigationBar.hidden == NO) 
    { 
    [self.navigationController setNavigationBarHidden:YES animated:YES]; 
    } 
} 

De esta manera la barra de navegación no aparece incluso después de la barra de búsqueda tiene ha sido usado.

-1
- (void) viewWillDisappear: (BOOL) animated 
{ 
    // self.searchOn property tell if full screen search is enabled 
    //if (self.searchOn) 
    //{ 

     [self.navigationController setNavigationBarHidden:NO animated:NO]; 
    //} 

    [super viewWillDisappear: animated]; 
} 


- (void) viewWillAppear: (BOOL) animated 
{ 
    //if (self.searchOn) 
    //{ 
     [self.navigationController setNavigationBarHidden:YES animated:YES]; 
    //} 

    [super viewWillAppear: animated]; 
} 
2

Ok, esto me molestó durante un par de horas, pero finalmente lo hice funcionar! El problema parece ser que UISearchDisplayController realiza un seguimiento de si ha ocultado o no la barra de navegación, y si lo ha hecho, la restaura, después de que la vista ha sido descartada. Es por eso que con muchas de las respuestas anteriores, se ve el final de la animación de la barra escondiéndose cuando se empuja la nueva vista. Sin embargo, al engañar al controlador de visualización de búsqueda, podemos cambiar este comportamiento.

Primero: subclase el UISearchDisplayController

Tras la respuesta sobre cómo mantener un control de navegación de su escondite, se encontró here, alteré el código, para mantener la barra de navegación oculta:

- (void)setActive:(BOOL)visible animated:(BOOL)animated 
{ 
    if(self.active == visible) 
     return; 

    [self.searchContentsController.navigationController setNavigationBarHidden:YES animated:YES]; 
    [super setActive:visible animated:animated]; 

    if (visible) 
     [self.searchBar becomeFirstResponder]; 
    else{ 
     [self.searchBar resignFirstResponder]; 
     [self.searchContentsController.navigationController setNavigationBarHidden:NO animated:YES]; 
    } 
} 

Tenga en cuenta que ocultamos la barra de navegación antes de llamar a la función super setActive. Esto parece evitar que la súper clase intente ocultar la barra de navegación y, consecuentemente, intentar restaurarla después de la selección de elementos. Ahora cuando el controlador se active, la barra se ocultará como siempre. También tenga en cuenta que restauramos la barra de navegación cuando searchBar renuncia al primer respondedor. Esto restaurará la barra si cancelamos el control.

Segundo: Ocultar barra de navegación al salir de

Si ocultar la barra de navegación de la vista va a desaparecer, se oculta:

-(void)viewWillDisappear:(BOOL)animated{ 
    [super viewWillDisappear:animated]; 

    [self.navigationController setNavigationBarHidden:YES animated:animated]; 
} 

Tercero: Ocultar barra de navegación al regresar

El único problema ahora es que si seleccionamos una fila de la tabla vista filtrada, cuando regresemos, la barra de navegación estará visible. Para solucionar este problema tenemos que poner un cheque en vista aparecerá:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    if(self.isFiltered){ 
     [self.navigationController setNavigationBarHidden:YES animated:NO]; 
    } 

} 

Mientras que esto se siente como un gran corte, se hace el truco y pude ver no hay mejor manera de hacerlo.

Cuestiones relacionadas