Skip to content

14 août 2010 | Rédigé par Mathieu

36

Gérer la navigation entre plusieurs vues : UINavigationController [Tutoriel iPhone n°5] [XCode 4]

Nouveau (avril 2011) : Ce tutoriel a été mis à jour et été testé pour XCode 4.

Une majorité d’applications iPhone proposent de naviguer dans les données par une voie hiérarchique. Par exemple, dans l’application « Contacts », l’écran le plus haut présente la liste des groupes, cliquez sur un groupe pour afficher les contacts qui le composent, etc. Cette façon de présenter les choses, le titre en haut de page, le bouton « Retour » ainsi que les transitions terriblement efficaces qui accompagnent les changements de vue sont gérés par un composant essentiel de la programmation CocoaTouch : les UINavigationController. Ce tutoriel vous propose de créer une application très simple, avec deux vues qui s’enchaînent selon ce principe.

Démarrez le projet

Créez un nouveau projet dans XCode. Vous serez probablement tenté d’utiliser le type de projet « Navigation-based Application » qui crée automatiquement le UINavigationController ainsi qu’une liste de données. Cependant, il y a dans ce template un peu trop de choses : nous allons nous contenter d’une « Window-based Application » qui nous permettra de bien comprendre les éléments à mettre en place.


J’ai appelé ce projet « TutoNavigation », je vous propose d’en faire autant. Si vous le compilez toute de suite, il ne présente qu’un bel écran blanc : une première fenêtre (window) qui est créée pour nous par XCode.

Ajoutez le UINavigationController

Ouvrez le fichier TutoNavigationAppDelegate.h et déclarez dans l’interface un nouvel objet UINavigationController ; nous l’appellerons navController.

@interface TutoNavigationAppDelegate : NSObject <UIApplicationDelegate> {
	UIWindow *window;
	UINavigationController *navController;
}

Implémentons tout de suite le code nécessaire. Pour cela, ouvrez le fichier TutoNavigationAppDelegate.m et repérez la méthode application: didFinishLaunchingWithOptions: Cette méthode, comme son nom l’indique, est appelée dès que l’iPhone a terminé toutes les routines qu’il doit exécuter au lancement d’une application. Ajoutons l’allocation mémoire et l’initialisation de notre navController.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    navController = [[UINavigationController alloc] init];
    [self.window addSubview:navController.view];
    // Override point for customization after application launch.
    [self.window makeKeyAndVisible];
    return YES;
}

Nous y avons ajouté deux instructions :

  • La première (alloc-init) est la procédure classique pour allouer de la mémoire et initialiser notre objet
  • La seconde permet d’ajouter une vue dans notre fenêtre : cette vue, c’est celle de navController.

Compilez cette première version. Vous constaterez qu’une grande barre de titre est apparue sur l’écran du simulateur.

Première vue

Nous allons à présent ajouter la première vue, celle qui sera affichée au moment du lancement de l’application. Elle contiendra un simple bouton « En savoir plus… » qui affichera, par la suite une seconde vue de détails.

Ajoutons une classe dans notre projet pour décrire cette première vue. Pour ce faire, choisissez « File » > « New » > « New File… » et créez un fichier UIViewController subclass. Choisissez la création automatique du XIB associé.


Appelez cette nouvelle classe FirstViewController.m et créez aussi le .h associé. Trois fichiers ont donc été ajouté dans votre projet :

  • FirstViewController.h
  • FirstViewController.m
  • FirstViewController.xib

Ajoutons notre bouton dans cette vue. Ouvrez le .h et ajoutez la déclaration d’une nouvelle méthode que nous appellerons seeDetails :

- (IBAction)seeDetails: (id)sender;

Ouvrez le .m, ajoutez une première implémentation de cette méthode :

- (IBAction)seeDetails: (id)sender {
	NSLog(@"Button pushed");
}

Enfin ouvrez le fichier .xib, ajoutez un RoundedRectButton, intitulez-le « En savoir plus… » en double-cliquant simplement dessus.

Reliez enfin son action « TouchUp Inside » sur la méthode « seeDetails » que nous venons de créer :

  • Cliquez-droit sur le bouton créé ;
  • Cliquez et faîtes glisser le rond en face de l’action « Touch Up Inside » vers l’objet « File’s Owner » ;
  • Dans la petite fenêtre qui s’ouvre alors, choisissez la méthode seeDetails que nous venons de créer.

Il reste à intégrer notre vue (FirstViewController) dans le NavigationController que nous avons créé plus tôt. Pour cela, ouvrez le fichier « TutoNavigationAppDelegate.m ».

Dans la partie supérieure du fichier, ajoutez la ligne :

#import "FirstViewController.h"

Dans la méthode application: DidFinishLaunchingWithOptions: nous allons pousser notre première vue dans le navigationController de la façon suivante :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
 
	navController = [[UINavigationController alloc] init];
	[self.window addSubview:navController.view];
 
	FirstViewController *firstVC = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
	[navController pushViewController:firstVC animated:NO];
	[firstVC release];
 
    // Override point for customization after application launch.
    [self.window makeKeyAndVisible];
 
	return YES;
}

Notez les éléments suivants :

  • Pour la première vue de l’application, nous ne l’affichons pas avec une animation. Ca ne changerait rien de toutes façons, mais Apple recommande de ne pas animer la première vue. C’est un motif de non validation d’application, donc inutile de tenter le diable.
  • Nous faisons un release de notre objet firstVC juste après l’avoir poussé dans le NavigationController. En effet, ce dernier fait un retain sur chaque vue qui lui est poussée.

Petit interlude : le UINavigationController, sa barre de titre, sa pile de vues.

Quel drôle de nom « pushViewController » pour afficher une vue, pourquoi ne pas appeler cette méthode « displayViewController » ou « show » ? En fait, ce nom n’a pas été choisi au hasard. UINavigationController, en plus d’afficher une superbe barre bleue, se charge de maintenir une pile des différentes vues que nous allons lui passer. Quand nous utilisons pushViewController, le UINavigationController la place en haut de sa pile de vues et l’affiche (avec ou sans animation). Toutes les vues précédentes (si elles existent) sont maintenues en mémoires et retenues par UINavigationController. Ainsi, quand la vue en cours ne sera plus utile (au clic sur le bouton retour, par exemple), elle sera supprimée de la pile et masquée, c’est la vue qui était juste en dessous qui sera affichée. La méthode pour retirer une vue de la pile se nomme : « popViewController ». Push / Pop : trop facile !

Et le titre dans la barre bleue, dans tout ça ? Et bien, UINavigationController va demander à la vue qui est en haut de la pile comment elle s’appelle pour afficher ce nom dans la barre. Ainsi, c’est la vue qui décide du nom à afficher dans la barre de titre ! Pour modifier ce titre, ouvrez le fichier « FirstViewController.m », dans la méthode « initWithNibName » crée par XCode ajoutez, dans le corps de la méthode, la ligne :

// Custom initialization
self.title = @"Accueil";

Pousser une seconde vue

De la même manière que précédemment, créons une nouvelle classe pour détailler notre seconde vue :

  • File >New > New File… et choisissez UIViewController sublass, n’oubliez pas de créer le .xib en même temps ;
  • Nommez cette classe DetailViewController ;
  • Ouvrez le fichier DetailViewController.xib et ajoutez un UILabel que vous personnaliserez à votre goût ;
  • Ajoutez lui un titre dans la méthode initWithNibName, par exemple « En savoir plus… ».

Retournons dans notre fichier FirstViewController.m pour modifier la méthode seeDetails que nous avons codée tout à l’heure. Nous allons, dans cette méthode pousser une instance de DetailViewController dans le UINavigationController.

Commençons par ajouter la référence à cette nouvelle classe. En haut du fichier, ajoutez :

#import "DetailViewController.h"

Puis modifiez la méthode seeDetails pour qu’elle devienne :

- (IBAction)seeDetails: (id)sender {
	DetailViewController *detailVC = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
	[self.navigationController pushViewController:detailVC animated:YES];
	[detailVC release];
}

Une fois encore, veuillez noter que :

  • Quand vous ajoutez une vue dans un UINavigationController, les deux objets se connaissent et la vue peut accéder à son UINavigationController avec la propriété self.navigationController
  • Comme il s’agit d’une seconde vue, nous avons précisé animated:YES
  • Là encore, nous faisons un release de la vue que nous avons créée, car le UINavigationController fait un retain.

Troisième étape… Il n’y a pas de troisième étape

Et c’est tout ! Compilez et lancez votre application : ça fonctionne ! UINavigationController s’occupe de tout le reste. Je vous parlais tout à l’heure de la méthode « pop » pour retirer une vue de la pile, mais UINavigationController prend en charge, de lui-même, la création du bouton retour qu’il intitule avec le titre de la vue en dessous dans la pile.

Du coup c’est presque trop court, mais c’est la fin de ce 5ème tutoriel consacré au développement iPhone. Si vous avez suivi jusqu’à la fin et que vous avez en face de vous une application avec deux vues enchaînées entre elles, félicitations : c’est un premier pas et nous avons quand même bien mis les mains dans le cambouis cette fois ! Les classes CocoaTouch font, certes, une grande partie du travail, mais l’important ici est de bien comprendre comment ces classes sont agencées et comment elles interagissent entre elles.

Ce tutoriel n’existerait pas sans les excellents cours CS193P de Stanford University et du fameux pushAndPop présenté par Evan Doll dont il est (assez librement) inspiré.

Si vous avez des questions ou si vous rencontrez des difficultés, n’hésitez pas à utiliser les commentaires. Enfin, et comme toujours, si vous avez aimé ce travail, n’hésitez pas à le faire connaître autour de vous ! ;-)

Encore un peu de lecture :

36 Commentaires Poster un commentaire
  1. Mr_g33k
    23 août 2010

    Bravo Mathieu, super tuto (comme les autres d’ailleurs), j’attends les prochains avec impatience. Utilisation du tabBarController pour continuer dans la navigation par exemple.
    Vivement la suite :D

  2. 24 août 2010

    Merci pour ton soutien. Un tuto sur les tabBarController, c’est une bonne idée, tu as raison !
    A très vite pour la suite ;-)

  3. David
    7 sept 2010

    Merci pour le tuto ;-D

    Par contre, comment communiquer entre les 2 vues.

    Exemple : vue1 j’ai une variable… je passe sur la vue2 je veux récupérer la variable de la vue1, la modifier et la renvoyer sur la vue1.

    Merci d’avance,
    David

  4. 9 sept 2010

    Oups, désolé, j’ai mis un peu de temps pour te répondre. Mais nous y voilà.

    Quand tu pousses un nouveau ViewController, tu l’instancies, tu l’ajoutes sur le NavigationController puis tu le release.

    Pour passer des informations, tu peux appeler des méthodes ou des setters avant de pousser l’objet sur le navigationController. Par exemple :

    // Instanciation
    DetailViewController *detailVC = [[DetailViewController alloc] initWithNibName:@ »DetailViewController » bundle:nil];

    // Passer des valeurs, par exemple :
    detailVC.propriete = 12;

    // Pousser
    [self.navigationController pushViewController:detailVC animated:YES];
    [detailVC release];

    Il faut évidemment que tu fasses évoluer ton ViewController pour prendre en compte ces propriétés (tu peux passer un objet modèle, par exemple).

    Nous aborderons ce point avec plus de détails dans un prochain tutoriel.

  5. David
    10 sept 2010

    Merci ;-D

    Je débute en XCode et j’ai hâte de voir le tuto complet.

    David

  6. David
    10 sept 2010

    Je viens d’essayer mais ça ne fonctionne pas.

    Dans ma vue2 j’ai déclaré un UItextField textDay

    .h

    IBOutlet UITextField *textDay;
    @property (nonatomic,retain) UITextField *textDay;

    .m

    @synthesize textDay;

    dans ma vue1 je passe le parametre comme ça :

    ViewCalendar *anotherViewController = [[ViewCalendar alloc] initWithNibName: @ »ViewCalendar » bundle:nil];

    anotherViewController.textDay.text = @ »23″;

    [self.navigationController pushViewController:anotherViewController animated:YES];
    [anotherViewController release];

    lorsque j’affiche la vue2, mon textField est vide.

    Merci de ton aide éventuelle. Sinon, j’attendrais le tuto ;-D

  7. David
    10 sept 2010

    J’ai affecté un NSString dans la vue2 et je donne la valeur de ce NSString à mon textField.

    du coup, dans ma vue1 pousse la valeur sur le NSString et non pas sur le textField.

    ça fonctionne ;-D

  8. 12 sept 2010

    Tu as répondu plus vite que moi. mais c’est effectivement ça la solution. En effet, quand la vue s’affiche (qu’elle est poussée), alors la vue est créée en fonction du NIB et les Objets qui sont dessus (le textField, entre autres) sont instanciés : pas avant ! Du coup, tu ne peux pas exploiter des éléments de la vue tant qu’elle n’a pas été créée.

    La bonne méthode, je pense, c’est de passer par un objet (dans ton cas un NSString mais un objet modèle, c’est encore ce qu’il y a de plus complet) et de mettre les valeurs de la vue en fonction de cet objet dans la méthode viewWillAppear.

  9. David
    13 sept 2010

    merciiiiiiiiiii ;-D

    Par contre, j’ai essayer de faire l’inverse et je n’y parviens pas.

    C’est-à-dire, je pousse un variable de la vue1 vers la vue2, je modifie cette variable sur la vue2 et je veux renvoyer la valeur modifiée sur la vue1.

    j’ai mis, justement, ma valeur dans la méthode viewWillAppear (dans la vue1). Rien ne s’affiche dans mon textField. La raison ==> via la console je constate que la valeur une fois sur la vue1 est nulle.

    Par contre, lorsque j’affiche la valeur affectée via la console sur la vue2, la valeur est bien la bonne.

    En fait, j’ai repris le même code mais ici dans la vue2
    a savoir :

    RootViewController *RootViewController = [[RootViewController alloc] initWithNibName: @ »RootViewController » bundle:nil];

    [self.navigationController popToRootViewController :RootViewController animated:YES]; // pour fermer la vue2
    [RootViewController release];

    mais je me demande si je n’ouvre pas une nouvelle vue sans l’affichée au lieu de faire appel à la « vraie » vue1 en cours.

    En, gros j’ai l’impression de faire :

    vue1 => vue2 => vue3
    …….<= vue2

    vivement ton tuto ;-D

    Merci encore.

  10. athis
    5 oct 2010

    Bonjour,

    tout d’abord merci pour les tutos présentés sur le site, ils m’ont bien aidé à débuter la programmation. Mon niveau reste cependant très modeste, je viens donc vers vous pour quelques petites précisions:

    J’essaye de développer une petite application permettant de faciliter certains calculs ( pour le boulot, en déplacement). Mon application pour le moment comporte 3 vues: un menu principal, une page ou l’on rentre des données (longueur, poids, etc) et la 3eme vue est censée afficher les résultats des différents calculs exécutés à partir des données entrées en vue 2. Mon problème est que je n’arrive pas a importer dans la vue 3 les données de la vue 2.

    J’ai bien lu les précédents commentaires notamment:

     »
    / Instanciation
    DetailViewController *detailVC = [[DetailViewController alloc] initWithNibName:@ »DetailViewController » bundle:nil];
    // Passer des valeurs, par exemple :
    detailVC.propriete = 12;
    // Pousser
    [self.navigationController pushViewController:detailVC animated:YES];
    [detailVC release];
    Il faut évidemment que tu fasses évoluer ton ViewController pour prendre en compte ces propriétés (tu peux passer un objet modèle, par exemple). »

    Cependant je ne comprends pas comment faire, quand je rentre quelque chose comme detailVC.longueurPoutre = longueur (nom de la donnée à récuperer de la vue 2) j’ai un message d’erreur « request for longueurPoutre in somehing not a structur or union »

    Si j’ai bien compris, il faut que je modifie mon ViewController pour être en mesure de récupérer des données avant de pousser, mais …. HELP je débute et je ne vois pas comment faire… Si quelqu’un pouvait faire un petit exemple concret ça m’aiderait vraiment!

    Et si des personnes sont vraiment motivées j’aimerais créer une 4eme vue qui elle affiche un graphique réalisé a partir d’une formule se servant des données de la vue 2. Existe t il une commande dans le genre de plot ( présente sur matlab pour la référence) disponible directement dans le framwork ? Si oui laquelle, Si non des pistes svp ?

    Merci, j’attends vos réponses avec impatience, tout comme un nouveau tutoriel !!

    Athis.

  11. athis
    6 oct 2010

    (Re)Bonjour à tous,

    j’ai enfin réussi a faire passer mes données d’une vue à l’autre ainsi qu’à utiliser viewWillAppear afin d’afficher des données dans les textfields à l’ouverture de la vue.

    Cependant je suis vraiment perdu pour la suite de mon application: tracer la courbe d’une fonction ( qui évolue en fonction des données entrées oar l’utilisateur…). J’aurais besoin de pistes sur les commandes à utiliser s’il vous plait. J’ai essayé de télécharger un framework: core plot mais impossible à le lancer en entier ( j’ai des messages d’erreurs provenant de l’intérieur même du framework … ).

    J’ai également téléchargé un exemple sur la base de donnée apple mais l’exemple est assez complexe, il fait appel a des sons et autres trucs inutiles pour moi ce qui me perd plus qu’autre chose…

    Pourtant ce que je demande toi être assez simple à réaliser, il s’agit d’un simple tracer de courbe du genre:

    longueur=3 (donné par l’utilisateur)
    chargement=500 (donné par l’utilisateur)

    « tracer pour x allant de 0 à longueur » f(x)= 2*x + chargement (ce que je voudrais réaliser)

    le tout s’affichant dans une de mes vues… (la courbe avec autour un rappel des données si possibles ainsi que la valeur max de la courbe, que je connais d’avance).

    sur des programmes comme matlab, mathcad et autres une simple fonction (plot / @) suffisent pour réaliser ceci, il doit bien y avoir quelque chose du genre non ? Bref, j’ai vraiment besoin d’aide =/

    Si une bonne âme pouvait passer me donner un coup de main… Je suis preneur !

    Sur ce, bonne fin de journée.

  12. 6 oct 2010

    Hello !

    Concernant la navigation et le fait de passer des informations entre les différentes vues, que ce soit dans un sens ou dans un autre, je pense qu’il va être temps de faire un tutoriel un peu plus complet sur le MODELE-VUE-CONTROLLER.

    Mais l’idée est la suivante :
    - j’ai un objet modèle : disons une poutre, puisque ça a l’air d’actualité. Cet objet a des propriétés (sa longueur, etc).
    - j’affiche une liste avec toutes mes poutres
    - quand je touche un élément de la liste, je veux afficher le détail de la poutre, j’instancie donc un nouveau UIViewController, je lui affecte dans une de ses propriétés la poutre que je viens de sélectionner, mais sous forme d’objet, pas juste sa longueur !
    - quand le nouveau UIViewController va être affiché, dans viewDidLoad, je met dans mon UITextField, ma valeur self.maPoutre.longueur par exemple.
    - quand je change la valeur de mon UITextField, je change la valeur dans mon objet self.maPoutre.longueur = /*nouvelle valeur*/
    - quand je je vais retourner à l’écran précédent (en appuyant sur le bouton BACK), je rafraîchis les éléments. Mon objet poutre ayant changé de valeur, la liste reprendra bien les valeurs que j’avais saisie à l’instant.

    Il y a donc deux types objets très importants :
    - la Poutre, l’objet modèle qui contient toute l’intelligence,
    - les UIViewControllers, qui récupèrent les données du modèle pour les passer à la vue.
    Et vous voyez là se dessiner le Modèle (poutre), Vue (le .xib d’InterfaceBuilder), Controller (UIViewController)

    Donc, si ça vous va, on fait un tuto sur le MODELE-VUE-CONTROLLER en général
    Puis un tuto : Application multivues pour passer les données d’une liste vers une page de détails et mise à jour.

    Je vous promets que je vous fait ça, mais il faut me laisser un peu de temps !

  13. 6 oct 2010

    Concernant la question de tracé de courbes avec XCode, comme ça je ne sais pas te répondre : je n’en ai jamais eu besoin.

    Athis, est-ce que tu peux me donner dans les commentaires le lien vers ton exemple sur le site d’Apple, je peux essayer de voir ça et voir comment je peux t’aider.

  14. athis
    7 oct 2010

    Ah merci Mathieu !!

    Je suis preneur pour un tuto de ce genre !! J’ai bien réussi a faire passer mes données mais à mon avis c’est plus du gros bidouilage pas du tout opti qui ferait honte à un vrai programmeur.

    Pour l’exemple trouvé sur apple: http://developer.apple.com/library/ios/#samplecode/Formulaic/Introduction/Intro.html%23//apple_ref/doc/uid/DTS40008932-Intro-DontLinkElementID_2 ( les fichiers sources sont à télécharger sur le côté mais tu dois connaitre ;) )

    Je vais essayer de comprendre le programme dans son ensemble et voir où se situe exactement les méthodes servant à calculer et afficher la courbe. Je te tiens au courant de mon avancée, mais su tu as le temps pour un peu d’aide je ne dis pas non.

    Bonne journée.

    Athis

  15. athis
    12 oct 2010

    Bonjour à tous,

    Je viens vous tenir au courant de mon avancée, j’ai réussi à tracer une courbe comme je le souhaitais, cependant les axes du graphiques sont tracés par moi même, ça reste donc assez sommaire mais ça progresse !

    En fait j’ai du créer un UIControl et utiliser le framework QuartzCore.
    L’exemple donné sur Itunes permet de bien comprendre le fonctionnement des différentes commandes.

    Mathieu j’espere que ton projet de tuto sur un MODELE-VUE-CONTROLLER est toujours d’actualité, je l’attends avec impatience =)

    Bonne journée à vous.

    Athis

  16. Alain Lambrette
    27 oct 2010

    Superbe Tuto, je comprend vraiment très bien la navigation grace à ce simple exemple, en plus c’est exactement ce que je cherche à faire :
    une page des bouton qui pointe vers des vues qui affiches des données, je vais compiler mes fardes papiers techniques
    ps: on peux avoir combiens de boutons par page ?
    alain

  17. 29 oct 2010

    @Alain Lambrette : merci pour ces compliments ;-) A priori il n’y a pas de limites du nombre de boutons par page. Apple recommande cependant de se limiter sur les actions par écran et de préférer, si c’est possible, une navigation par liste qui dirige vers une page de détails. Ce sera d’ailleurs l’objet d’un tuto très prochainement !

  18. ronie
    5 nov 2010

    Bonjour, Merci pour le tuto, mais j’ai un petit problème je veux ajouter un « bar button Item » mais j’arrive pas parce que il n’y a pas la barre de navigation sur mon interface builder, est ce qu’il y a une solution pour gérer ça ?

    je te remercie,

    Bonne soirée,

  19. 4 déc 2010

    Heps,

    je passe juste pour dire merci. J’ai cherché un peu partout des tutos de qualité sur le sujet et c’est le tiens que je préfère. Tu expliques ce qu’il faut dans le détails sans t’attarder sur des choses inutiles, c’est bien.

  20. fatflex
    6 fév 2011

    Merci pour ton tuto , le tuto est bien fait , j’ai réussi l’exercice du 1er coup.
    :-D

  21. nadhem
    8 mar 2011

    Bravo pour le tuto c’est clair je vous encourage a enrichir encore le site avec d’autre tuto
    bon travaille

  22. J-Louis
    31 mar 2011

    Bonjour
    je viens de me lancer dans le tuto mais je bloque avec une erreur

     » « _OBJC_CLASS_$_FirstViewController », referenced from:

    objc-class-ref-to-FirstViewController in TutoNavigationAppDelegate.o

    ld: symbol(s) not found

    collect2: ld returned 1 exit status

     »
    juste apres avoir remplacé

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    navController = [[UINavigationController alloc] init];
    [window addSubview:navController.view];

    FirstViewController *firstVC = [[FirstViewController alloc] initWithNibName:@ »FirstViewController » bundle:nil];
    [navController pushViewController:firstVC animated:YES];
    [firstVC release];

    // Override point for customization after application launch.
    [window makeKeyAndVisible];

    return YES;
    }

  23. 19 avr 2011

    Salut à tous !
    J’ai mis à jour le tuto et je l’ai adapté pour XCode 4. J’en ai profité pour retester et ça fonctionne ! :-)

  24. khoub
    20 avr 2011

    bonjour tous le monde
    c’est bon tuto mais j’ai rencontrer une probleme au niveau d’ajout de la page UIViewController subclass puisque lorsque allé vers fichier–newfile voila ce que m’affiche :
    ios
    application
    library
    Mac OS X
    application
    frame…

    donc je ne trouve pas comment ajouter UIViewController subclass
    merci de m’aider SVP

  25. Olivier
    24 avr 2011

    Merci pour ce tuto !

    Juste une petite remarque car je pense qu’il y a une petite coquille : tu dis qu’il ne faut pas animer la première vue et pourtant dans le code tu met animated à YES ([navController pushViewController:firstVC animated:YES];).

    Je pense qu’il faudrait plutôt mettre à NO en fonction de tes remarques juste en dessous.

    Merci encore pour tes tutos.

    Olivier

  26. 24 avr 2011

    @Olivier.
    Oui tu as raison ;-) C’est le « faîtes ce que je dis, pas ce que je fais »… C’est corrigé, en tous cas !

  27. Omnislash
    14 juin 2011

    Bonjour, merci pour cet excellent tuto.

    Petite question:
    Comment savoir quand l’utilisateur revient sur le FirstViewController ?

    De base je cache mon navigationController, je le fait apparaitre quand on clic sur un bouton qui mene vers un autre ViewController, et j’aimerai le cacher a nouveau quand on revient au niveau de FirstViewController.

    Merci d’avance ^^

  28. dante20007
    4 oct 2011

    Je ne parviens pas faire un build de ce projet, j’ai plein d »erreur, rien qu’avec les premières lignes de code:

    @interface TutoNavigationAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    UINavigationController *navController;
    }

    Serait il possible d’avoir les sources complètes du projet ou de l’aide de votre part ?

    Merci.

  29. Flou
    9 nov 2011

    Hello,

    Ce tuto me plait bien hors je n’arrive pas à linker l’évènement « Touch inside » au « File Owner » … Il ne veut pas le bourricot.

    Sachant que je n’ai pas migré vers XCode 4 … Est ce là le problème ?

  30. Sebastien
    9 jan 2012

    Hello

    Le tuto est bien construit et j’attaque le développement iphone avec ceux la.

    Cependant démarrant sous Xcode 4 je n’ai pas « windows based application » que prendre en substitution, je fais quelques tests avec un single based application mais je n’arrive pas a suivre le tuto j’ai des erreurs de partout ? :(
    pourtant je respecte ce que le tuto dit … meme le appdelegate.m ne passe pas :/

    des réponses ?

    merci beaucoup en tout cas et beau travail ! :)

  31. Sebastien
    10 jan 2012

    J’ai repris le tuto a la lettre et je n’arrive pas a ce résultat j’aimerais un peu d’aide ca fait plusieurs jours que je cherche pourquoi.

    je vous montre mes sources :
    j’ai fais quelques test si quelqu’un pourrait me dire ce qui ne va pas.
    j’ai n’ai pas crée de Windows based application parce que je ne lai pas dans xcode 4.2.1 mais un single view

    voici mes sources :

    appdelegate.h

    #import

    //@class ViewController;

    @interface AppDelegate : UIResponder
    {
    UIWindow *window;
    //UIViewController *navController;
    UINavigationController *navController;
    }

    @property (strong, nonatomic) UINavigationController *navController;
    //@property (strong, nonatonic) UINavigationController *navController;
    @property (strong, nonatomic) UIWindow *window;
    //@property (strong, nonatomic) ViewController *viewController;

    @end

    appdelegate.m

    #import « AppDelegate.h »

    #import « FirstViewController.h »

    @implementation AppDelegate

    @synthesize window = _window;
    @synthesize navController;
    //@synthesize viewController = _viewController;

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    navController = [[UINavigationController alloc]init];

    [window addSubview:navController.view];

    FirstViewController *firstVC = [[FirstViewController alloc] initWithNibName:@ »FirstViewController » bundle:nil];
    [navController pushViewController:firstVC animated:NO];
    // Override point for customization after application launch.
    [self.window makeKeyAndVisible];

    }

    je n’arrive meme pas a afficher FirstViewController ma vue de depart
    Si quelqu’un pourrait bien m’aider ca serait cool !

    Merci encore ! :)

  32. Quentin
    28 fév 2012

    Merci pour ce tuto,

    Par contre, j’ai un soucis chez moi :x

    Lorsque je lance l’application dans le simulateur, l’écran de l’iPhone est noir…
    Aucunes erreurs… Mais l’écran est noir.
    Quand j’ajoute aucunes vues, je lance l’appli, j’ai l’écran blanc avec la navigation bar, mais après, j’ajoute une view, je tape le code du tuto, et puis, plus rien.

    Je suis débutant xcode.

    Merci d’avance.

  33. Staroun
    20 juin 2012

    Merci :)

    J’avais du mal à comprendre le fonctionnement mais maintenant ça va mieux.

    Thx.

  34. Fiona
    26 juin 2012

    Bonsoir,

    Je suis dans le même cas, j’utilise Xcode 4.2.1.

    Par contre moi j’ai crée une « utility application », le symbole étant le même que pour une « based application » je me suis dit que ça devait l’équivalent de la version précédente.

    Et en copiant et collant les deux premières étapes je ne peux pas compiler car j’ai des erreurs partout..

    Serait il possible d’avoir une version pour Xcode 4.2.1 ?

    Merci :D

  35. Tarik
    22 mar 2013

    Bonjour Mathieu,

    J’ai un problème dont je connais pas la source, en fait j’ai suivi à la lettre ton tutoriel, et je bloque sur la ligne ou il y’a le release du controlleur.
    [CODE]
    [detController release];
    [/CODE]
    L’intellisence m’affiche bien la méthode release mais elle sur-ligné comme si elle était depricated.
    et il me met une erreur :
    [ERROR]
    FirstViewController.m: error: Semantic Issue: ‘release’ is unavailable: not available in automatic reference counting mode
    [/ERROR]

    NB : Je suis sur XCODE 4.2 et MAC OS X 10.6.8 emmulé sur VMWare Workspace 8,

    Merci d’avance pour ton aide.

    Tarik

Trackbacks & Pingbacks

  1. Les tweets qui mentionnent Gérer la navigation entre plusieurs vues : UINavigationController [Tutoriel iPhone n°5] | Tuto Mobile -- Topsy.com

Une question, une suggestion, une opinion? Partagez ce que vous pensez, laissez un commentaire.

(obligatoire)
(obligatoire)

Note: Votre adresse email ne sera jamais publiée.

Suivez les réponses aux commentaires