0

J'ai une application de barre d'onglets à trois vues dont la deuxième vue doit contenir un contrôleur de navigation. Dans le contrôleur de nav, la première vue/racine sera une vue personnalisée contenant une vue évolutive qui, lorsque vous touchez une cellule, poussera une autre vue personnalisée à divulguer des détails sur la cellule touchée.Ajout d'un UINavigationController à une application de barre d'onglets

J'ai trouvé la documentation à ce sujet mais cela n'a pas de sens pour moi ou semble voler au-dessus de ma tête. Les docs disent que vous devez créer le uiviewcontroller situé dans les vues de navcontroller ou du moins s'y référer par programmation. J'utilise Interface Builder et je suis devenu très à l'aise pour l'utiliser, donc le faire par programmation me fait un peu peur.

En outre, ce morceau de code de la documentation semble troublante:

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
[window addSubview:myNavigationController.view]; 
} 

ci-dessus tirée de "Programmation ViewController pour iPhoneOS" documentation de pomme

serait pas en charge et afficher immédiatement le UINavigationView? Un problème est que je ne veux pas afficher le navview immédiatement. le navController/stack est un onglet secondaire. Alors, comment et où implémenter mon navController (maintenant je l'ai installé dans mon délégué (ce que je pense est correct) J'ai pu charger un UInavigationController de base avec une barre de navigation et une vue vide, --minus l'affichage du contenu personnalisé, par le constructeur d'interface, mais je suis à une perte sur la façon de remplir les vues de contenu personnalisé.

Hope this sens.

Toute aide serait appréciée,

Nick

Répondre

1

La première chose à comprendre est comment UINavigationController fonctionne.Il pousse UIViewControllers, pas les vues. En quelque chose se passe dans votre deuxième onglet (où UINavigationController vit) vous allez pousser un UIViewController sur la pile.

Cela se fait généralement dans:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath; 

qui fait partie du protocole UITableViewDelegate. Ainsi, lorsque tableView: didSelectRowAtIndexPath est appelée, vous devez déterminer quel UIViewController à pousser sur la pile. Vous pouvez charger ce View Controller à partir d'une plume ou le créer par programmation. Puisque vous vous sentez à l'aise avec IB, je suggère de le charger à partir d'une plume.

Je ne m'inquiéterais pas de trivia comme "où devrais-je instancier mon UINavigationController?" maintenant. D'abord, faites-le fonctionner. Puis s'inquiéter de l'endroit où les choses «devraient» aller.

Il est peut-être préférable de faire fonctionner le composant UINavigationController dans un projet distinct, puis de le plier dans votre projet principal. Cela vous permet d'ignorer beaucoup de petits détails pendant que vous vous concentrez sur le contrôleur de navigation.

+0

Cela a du sens, j'ai utilisé un peu didselectrowindindexpath donc je suis familier avec cette méthode, mais je suis encore un peu confus sur ce que je devrais faire ici, dois-je envoyer un message à uinavcontroller (si oui quel message?)? De plus, je ne peux même pas faire apparaître le uitableview personnalisé en tant que contrôleur racine dans la zone de contenu personnalisée de l'uinavcontroller, donc il n'y a aucun moyen de sélectionner une ligne dans un chemin d'index si vous obtenez ma dérive. apprécier toute clarification. Nick – nickthedude

+0

J'ai aussi aimé votre idée de le sortir dans une application séparée juste pour le simplifier jusqu'à ce qu'il soit logique. Merci. – nickthedude

+0

Dans tableView: didSelectRowAtIndexPath: vous devez envoyer un message pushView à votre contrôleur de navigation. Vous devez fournir le UIViewController en tant que paramètre à pushView. C'est le VC qui contrôle la vue que vous souhaitez activer. Vous pouvez le créer par programme ou le charger à partir d'une plume. –