2013-08-14 2 views
2

J'ai implémenté une version personnalisée d'un formulaire de recherche qui ressemble beaucoup à un UISearchBar avec une barre de portée (mais est en fait assemblé par programmation pour des raisons d'interface utilisateur). L'écran se charge avec un TextField, vous appuyez sur TextField et la barre de navigation s'anime à partir de l'écran, le champ de texte augmente et un contrôle segmenté apparaît pour filtrer les résultats.iOS - NavigationBar montrant sur contrôleur enfant, caché sur le contrôleur parent

Quoi qu'il en soit, tout cela fonctionne, mais quand je tape sur l'un des résultats de la recherche mon code pousse un nouveau ViewController. Le problème est que le nouveau contrôleur est poussé sans une barre de navigation (parce que j'ai utilisé [[self navigationController] setNavigationBarHidden:YES animated:YES] lors du passage à l'état de recherche).

Je peux afficher la barre de navigation lorsque le nouveau ViewController est poussé, ou même l'animer lorsque la transition vers le nouveau ViewController apparaît - mais toutes ces solutions semblent maladroites. Je veux que cela fonctionne comme si vous utilisiez un UISearchBar (en fait plus comme l'application de messagerie) en ce sens que la barre de navigation restaurée semble glisser de la droite comme si elle faisait partie du contrôleur de vue enfant.

J'espère qu'il y aura une solution simple ... merci

+1

Une façon d'obtenir le comportement que vous voulez est d'imbriquer simplement le nouveau 'UIViewController' dans un compl etely séparer 'UINavigationController' – MikeS

+0

C'est une idée décente et mérite d'être poursuivie si je ne peux pas penser à autre chose. Les problèmes sont que je n'obtiens pas le bouton 'back' dans la barre de navigation du nouveau ViewController pour revenir à la recherche (du moins pas sans un peu de fiddling supplémentaire, que j'espère éviter). –

+1

Peut-être, bien que le «bidouillage supplémentaire» peut être assez minimal (un seul paquebot, essentiellement). – MikeS

Répondre

5

Pour toute personne qui vient à cela, la solution est de rendre votre contrôleur le délégué du UINavigationController, puis afficher ou masquer la barre de navigation dans vos méthodes de délégué.

Votre contrôleur doit mettre en œuvre le protocole:

@interface MYSearchController() <UINavigationControllerDelegate> 

Puis, en -(void)viewDidLoad assigner votre contrôleur en tant que délégué:

[self navigationController].delegate = self; 

Enfin, mettre en œuvre une méthode comme ceci:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    if(viewController == self) 
    { 
     if(_searchState && ![self navigationController].navigationBarHidden) 
     { 
      [[self navigationController] setNavigationBarHidden:YES animated:YES]; 
     } 
    } 
    else 
    { 
     if([self navigationController].navigationBarHidden) 
     { 
      [[self navigationController] setNavigationBarHidden:NO animated:YES]; 
     } 
    } 
} 
+0

Je travaille sur ce problème avec Xcode 5.1/iOS7 et le setNavigationBarHidden est ignoré dans mon cas. Semble que quelque chose a peut-être changé, le délégué est déclenché mais aucun changement dans la vue, toujours caché à la suite de faire un filtre sur une vue de table en utilisant un contrôleur d'affichage de recherche. Cela me pointe dans la bonne direction, donc +1 –

Questions connexes