2010-05-06 5 views
0

Je travaille sur une application iPhone fonction de la vue qui a le flux suivant:Navigation Controller ne pas pousser/Popping Voir Contrôleurs

search -> (list | map) -> details

Pour réaliser les transitions entre les vues, j'ai une UINavigationController, la recherche Contrôleur de vue étant la racine. Après un utilisateur effectue une recherche, je passe à une vue avec un contrôle segmenté, qui agit comme un onglet pour basculer entre la fonctionnalité de liste et de carte (par une suggestion d'un related question que j'avais). Cette vue contient un UIViewController, qui me permet de basculer entre la vue liste/carte lorsqu'un utilisateur appuie sur le contrôle segmenté. Je vais bien jusqu'à ce point. En d'autres termes, je suis capable de passer de la vue de recherche à un SwitchViewController, qui me permet de basculer entre les vues de liste et de carte. À partir du SwitchViewController, je peux également revenir à la vue de recherche.

Comme vous pouvez le voir à partir du flux mentionné ci-dessus, je voudrais fournir la possibilité de passer à une vue détaillée. Chaque ligne de ma table dans la vue de liste contient un bouton de divulgation des détails pour permettre à l'utilisateur d'accéder à une vue détaillée. Le problème est que, quand j'essaie de pousser la vue des détails sur la pile de navigation, rien ne se passe. Ci-dessous est la méthode déléguée (à partir de mon contrôleur de liste) pour gérer le bouton de divulgation des détails en cours d'écoute. J'ai mis en place des points de rupture, donc je sais que le code est en cours d'exécution. Le contrôleur de navigation ne veut tout simplement pas pousser le module detailsController sur la pile (je suppose que je n'ai pas de pointeur vers le bon UINavigationController).

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath { 
if (detailController == nil) 
{ 
    detailController = [[DetailsViewController alloc] init]; 
} 

[self.navigationController pushViewController:detailController animated:YES]; 
}

En supposant que je manque probablement un pointeur vers le contrôleur de navigation, j'exposais une propriété UINavigation sur ma liste et une vue sur la carte (NavigationController est en lecture seule) et les initialisés avec un pointeur vers le contrôleur de navigation de mon SwitchViewController (la vue responsable de la commutation entre les vues liste/carte lorsqu'un utilisateur change la valeur du contrôle segmenté). Malheureusement, cela n'a pas résolu le problème.

Suis-je sur la bonne voie? Si c'est le cas, comment puis-je voir que ma vue a un pointeur vers le contrôleur de navigation correct? Dois-je ajouter un délégué, ce qui me permet d'appeler une fonction dans le SwitchViewController qui passe dans la vue des détails (cela semble désordonné)?

+1

Est-ce que vôtre est une application basée sur la vue? – Warrior

+0

Ouais! Merci pour la question. Je mettrai à jour mon texte pour l'indiquer. – senfo

Répondre

1

J'ai fini par créer simplement des délégués sur les vues de liste et de carte, que j'utilise pour appeler une méthode sur SwitchViewController pour changer la vue. J'espérais trouver un moyen plus propre, mais cela a fait l'affaire.

2

Etes-vous sûr que vous avez un contrôleur de navigation? Dans votre code, mettez NSLog(@"%@",self.nagivationController);. Si cela se produit, vous avez des problèmes. En outre, essayez [self.parentViewController.navigationController pushViewController:detailController animated:YES]; .

+0

Merci pour la réponse. Je m'excuse pour le délai de réponse. Lorsque j'essaye ceci, j'obtiens la sortie suivante: 2010-05-07 11: 25: 44.861 MyAppName [2095: 207] (null). Je sais que j'ai un contrôleur de navigation parce que je l'utilise pour passer de la vue de recherche à la vue liste/carte. J'ai également essayé d'accéder au contrôleur de navigation des parents. Malheureusement, cela n'a pas réussi. – senfo

2

Pour implémenter le contrôleur de navigation dans une application basée sur la vue.

Mettez ce code

Dans délégué .h classe

 MyViewController *viewController; 

Dans délégué .m classe

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

UINavigationController *nvcontrol =[[UINavigationController alloc] initWithRootViewController:viewController]; 

[window addSubview:nvcontrol.view]; 

[window makeKeyAndVisible]; 

} 

ici "MyViewController" devrait être remplacé par votre viewcontroller. Après l'implémentation dans votre classe délégué, votre code fonctionnera.

Tous les meilleurs.

+0

Juste pour m'assurer que je vous suis correctement. J'ai ajouté un contrôleur de navigation à mon fichier MainWindow.xib par l'intermédiaire d'Interface Builder, où j'ai également configuré la plume racine. Je crois que ce que vous suggérez ici, c'est que je fais simplement la même chose, mais dans le code. Est-ce exact? Il est important de noter que le contrôleur de navigation fonctionne jusqu'à ce que j'atteigne le SwitchViewController (la vue, qui me permet de basculer entre les vues de liste et de carte). – senfo

Questions connexes