2010-02-26 9 views
15

J'ai une configuration UISearchDisplayController avec un UITableViewController qui est imbriqué dans un UINavigationController. Lorsqu'une sélection d'une cellule est effectuée, la méthode UITableView'sdidSelectRowAtIndexPath est déclenchée, ce qui pousse une nouvelle vue vers le contrôleur de navigation parent. Cette nouvelle vue devrait avoir la barre de navigation cachée à l'entrée.Je conserve la navigationBar de UINavigationController masquée après la sélection de UISearchDisplayController

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

J'utilise cette ligne dans la méthode didSelectRowAtIndexPath pour cacher la barre de navigation. Cela fonctionne correctement lorsqu'une ligne est sélectionnée sans utiliser le contrôleur de recherche, mais qu'elle est remplacée lors de la sélection d'un résultat de recherche. Il semble que le UISearchDisplayController le prenne dans sa droite pour décocher la navigationBar quelque temps après que la ligne soit sélectionnée.

Si je déplace l'appel setNavigationBarHidden dans la méthode viewWillAppear de la vue cible, les résultats sont similaires. Je peux le faire fonctionner en plaçant l'appel de la peau dans viewDidAppear, mais cela fait un très effet de transition maladroit qui se sent nerveux et hors de propos. Je voudrais que la navigationBar soit déjà cachée avant que la nouvelle vue ne glisse sur l'écran.

Est-ce que quelqu'un sait où se déroule la barre de navigation et/ou comment contourner ce comportement?

+0

Désolé je n'a pas encore marqué une bonne réponse; J'ai finalement trouvé un hack qui a fonctionné, qui est probablement le même que celui ci-dessous, mais j'ai depuis déménagé et je n'ai pas regardé ce projet depuis un moment. Quand j'aurai une chance, je vérifierai la méthode que j'ai utilisée et je mettrai à jour cette question. – peppy

+0

Quel piratage avez-vous utilisé? – Sorig

Répondre

1

tombai sur le même problème, a réussi à le faire fonctionner en douceur avec ce hack laid:

- (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

Cela peut ne pas être la solution la plus élégante, mais je crois qu'il fait exactement ce que vous voulez qu'il . J'ai rencontré un problème similaire, et ma solution était d'avoir une méthode qui cache la barre de navigation, qui est appelée après un délai de 0 secondes comme suit.

La méthode appelée est:

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

Ensuite, dans la méthode viewDidLoad, je donne les résultats suivants:

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

Cela fonctionne et supprime la barre de navigation d'un seul instantané. Vous pouvez modifier le délai si vous souhaitez que l'animation soit supprimée après un délai. J'ai essayé [self hideNavBar] mais cela n'a tout simplement pas fonctionné, donc je m'en tiens à ce que j'ai ci-dessus.

J'espère que cela aide, et si quelqu'un a une solution plus élégante, je suis intéressé!

+0

Merde cela m'a eu pour la meilleure partie d'une heure. Merci! Juste pour clarifier, vous devez mettre cela dans le contrôleur de vue qui est poussé sur la pile de navigation. – Ben

+0

la réponse ci-dessus ne fonctionnera pas sur iOS 7 –

0

j'ai eu le même problème: mon avis a la barre de navigation cachée par défaut et est ici la façon de le garder caché:

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

De cette façon, la barre de navigation ne semble pas même après la barre de recherche a déjà utilisé.

-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, cela m'a embêté pour les quelques heures, mais j'ai finalement réussi à le faire fonctionner! Le problème semble être que le UISearchDisplayController garde une trace de si oui ou non il a caché la barre de navigation, et si c'est le cas, il le restaure, après que la vue ait été fermée. C'est pourquoi, avec la plupart des réponses ci-dessus, vous voyez la fin de l'animation de la barre se cacher lorsque la nouvelle vue est poussée. Cependant, en trompant le contrôleur d'affichage de recherche, nous pouvons changer ce comportement.

Première: Créer des sous UISearchDisplayController

Après la réponse sur la façon de garder un contrôleur de navigation de se cacher, trouvé here, j'ai modifié le code, pour garder la barre de navigation cachée:

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

Notez que nous cachons la barre de navigation avant d'appeler la fonction super setActive. Cela semble empêcher la super classe d'essayer de cacher la barre de navigation et, par conséquent, d'essayer de la restaurer après la sélection de l'objet. Maintenant, quand le contrôleur devient actif, la barre sera cachée comme d'habitude. Notez également que nous restaurons la barre de navigation lorsque searchBar démissionne du premier répondeur. Cela restaurera la barre si nous annulons hors du contrôleur.

Deuxième: Masquer la barre de navigation Au moment de quitter

Si nous cachons la barre de navigation dans la vue disparaîtra, il sera caché:

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

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

Troisième: Masquer la barre de navigation lors du retour

Le seul problème est maintenant que si nous sélectionnons une ligne de la vue de table filtrée, à notre retour, la barre de navigation sera visible. Pour corriger cela, nous devons mettre un chèque en vue apparaîtrez:

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

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

} 

Bien que cela ressemble à un énorme hack, il fait le tour et je ne pouvais voir pas de meilleure façon de le faire.

Questions connexes