De nombreux View Controllers

mushumushu Membre
mars 2012 modifié dans Vos applications #1
Bonjour,

je suis en train de développer un application contenant un menu.

Chaque élément de menu appelle (pushViewController) un ViewController différent.



Je me demandais du point de vue technique et optimisation,

_vaut-il mieux importer tous les ViewController dans le .h et faire un big if / switch pour savoir lequel pusher

ou

_vaut-il mieux faire de l'appel de classe dynamique, genre
[font=Consolas, Menlo, Monaco,]
<br />
id myGreatObject = [[classToUseToCreateNewObjects alloc] init];<br />
[/font]

[font=Consolas, Menlo, Monaco,]?[/font]

[font=Consolas, Menlo, Monaco,]Bien cordialement[/font]




Modo: le titre du sujet a été modifié pour être plus parlant. Merci de faire des efforts en ce sens.

Réponses

  • CéroceCéroce Membre, Modérateur
    mars 2012 modifié #2
    Le mieux c'est d'importer les .h des ViewControllers dans ton .m et pas dans ton .h. Le reste de l'appli n'a pas besoin de connaà®tre leurs classes précises.
  • AliGatorAliGator Membre, Modérateur
    J'avoue que si j'ai un menu à  4-5 entrées à  faire par exemple, je fais importer les ".h" des VC secondaires dans le ".m" du menu, et faire un switch.



    Mais si mon menu est conséquent, et surtout que dans tous les cas quand je fais un push j'ai juste à  allouer une instance de la bonne classe de ViewController et à  la pusher (mais pas besoin de configurer les propriétés de ladite instance selon les cas, parfois initialiser telle propriété avec telle valeur, parfois telle autre propriété avec telle autre valeur...), alors je profiterai sans doute plutôt de l'aspect dynamique du runtime :

    - J'associe (dans un NSDictionary par exemple) à  chaque élément de menu le nom de la classe de ViewController à  utiliser

    - Lors du clic sur une cellule, je récupère le nom de la classe, je fais un petit NSClassFromString pour récupérer un objet "Class", et je fais un alloc/init/autorelease dessus pour le pousser (pushViewController) directement





    - Avantage de cette méthode, c'est qu'elle est générique.

    - Inconvénient, c'est qu'il n'y a du coup aucune validation par le compilateur : si je fais une coquille et orthographie mal le nom d'une des classes dans mon NSDictionary qui associe une classe à  chaque élément du menu, le compilateur ne va rien me dire mais ça va crasher au runtime.

    - Alternative intermédiaire, je fais cette méthode mais au lieu de mettre en dur les noms des classes à  associer, sous forme de NSString constante, à  chaque élément de menu (et de ce fait risquant de faire une coquille et d'avoir des crash au runtime), utiliser NSStringFromClass([MonViewController class]). Et importer le "MonViewController.h" dans mon .m. Comme ça le compilateur va gueuler si je fais une faute dans le nom de ma classe, contrairement à  si j'avais mis le nom directement @MonViewController.
  • CéroceCéroce Membre, Modérateur
    'AliGator' a écrit:


    - Alternative intermédiaire, je fais cette méthode mais au lieu de mettre en dur les noms des classes à  associer, sous forme de NSString constante, à  chaque élément de menu (et de ce fait risquant de faire une coquille et d'avoir des crash au runtime), utiliser NSStringFromClass([MonViewController class]). Et importer le "MonViewController.h" dans mon .m.




    Je ne vois pas l'intérêt de procéder ainsi. Autant instancier directement avec le bon nom de la classe puisqu'on importe le .h.
  • AliGatorAliGator Membre, Modérateur
    L'intérêt c'est que si tu as un menu avec 50 UIViewControllers, si tu veux instancier directement chaque bon ViewController en fonction de la ligne tapée dans ta UITableView de menu, tu vas avoir à  faire un switch avec les 50 cas possibles.

    Alors que si tu as par exemple un NSArray qui liste tes 50 classes de UIViewControllers dans ton menu, dans la méthode "didSelectRowAtIndexPath" il suffit de faire :
    Class cls = NSClassFromString([vcList objectAtIndex:indexPath.row]);<br />
    id vc = [[[cls alloc] init] autorelease];<br />
    [self.navicationController pushViewController:vc animated:YES];
    
    Et basta, pas de switch avec 50 cas.
  • CéroceCéroce Membre, Modérateur
    ça me paraà®t quand même un cas extrême.

    D'ailleurs, ne pourrait-on pas mettre les objets-classes dans un NSArray:


    NSArray *controllerClasses = [NSArray arrayWithObjects: [MyViewController0 class], [MyViewController1 class], [MyViewController2 class], nil];
    




    Je n'ai pas essayé, mais ça doit fonctionner, non ?
  • mushumushu Membre
    En fait j'essaye d'utiliser le JTRevealSideBar, un petite bibliothèque pour faire un menu Facebook-like mais je ne m'en sors pas.

    Dans l'exemple donné, un seul même ViewController est utilisé pour chaque élément de menu.



    Perso ce qui m'intéresse est d'avoir un ViewController différent pour chaque élément de menu mais je n'arrive pas à  trouver un solution pour faire ça...



    Quelqu'un l'aurait déjà  utilisé ?
  • AliGatorAliGator Membre, Modérateur
    'Céroce' a écrit:


    D'ailleurs, ne pourrait-on pas mettre les objets-classes dans un NSArray:

    Je n'ai pas essayé, mais ça doit fonctionner, non ?
    image/huh.gif' class='bbc_emoticon' alt='???' /> Bah c'est exactement ce que je propose depuis le début, Céroce...

    Bon sauf qu'il me semble que les "Class" ne sont pas des NSObject, donc que tu ne peux pas les mettre dans un NSArray (une Class n'a pas de méthode retain, release, et tout, ce sont des métadonnées), c'est pour ça que dans ce genre de cas on passe par NSStringFromClass et NSClassFromString.
  • 'Céroce' a écrit:


    - Inconvénient, c'est qu'il n'y a du coup aucune validation par le compilateur : si je fais une coquille et orthographie mal le nom d'une des classes dans mon NSDictionary qui associe une classe à  chaque élément du menu, le compilateur ne va rien me dire mais ça va crasher au runtime.




    Pour éviter le crash tu peux simplement faire :


    <br />
    NSString *classString = [vcList objectAtIndex:indexPath.row];<br />
    Class cls = NSClassFromString(classString);<br />
    [b]if (cls &amp;&amp; [cls isSubclassOfClass:[UIViewController class]])[/b] {<br />
        id vc = [[[cls alloc] init] autorelease];<br />
        [self.navicationController pushViewController:vc animated:YES];<br />
    }<br />
    else {<br />
        NSLog (@&quot;%@ ? SRSLY ?&#33;&quot;, classString);<br />
    }<br />
    
  • Bon finalement j'ai réglé mon problème en utilisant un autre système de menu Facebook-like avec lequel mon problème ne se pose pas (ZUUIRevealController)

    Merci à  tous
  • Et pout à  propos d'un autre sujet, quel est le meilleur moyen pour sauvegarder une hiérarchie d'objets dans un fichier ?



    J'ai commencé avec les property lists mais, maintenant ma structure de données s'étant complexifiée un peu, c'est un peu lourd de convertir tous ses objets en NSString, NSNumber, etc... pour les faire rentrer dans le pList.



    Il existe un moyen pour sauvegarder des objets tels quels dans un fichier sans avoir à  les convertir en types simples?
  • AliGatorAliGator Membre, Modérateur
    'mushu' a écrit:


    Et pout à  propos d'un autre sujet
    Autre sujet, nouveau thread dans le forum, merci image/smile.png' class='bbc_emoticon' alt=':)' />
  • 'AliGator' a écrit:


    Autre sujet, nouveau thread dans le forum, merci image/smile.png' class='bbc_emoticon' alt=':)' />


    c'est pour le même projet...
  • AliGatorAliGator Membre, Modérateur
    mars 2012 modifié #14
    Et alors ? Un sujet du forum n'est pas à  lié à  un projet. C'est lié à  une question technique que les membres se posent.

    Là  c'est une autre question, une question générique qui plus est, à  savoir comment sauvegarder une hiérarchie d'objets. Ca n'a rien à  voir avec le titre "De nombreux ViewControllers" et le fait que tu aies plusieurs VC dans ton projet.



    S'il y a d'autres gens qui recherchent comment sauvegarder des grosses structures dans un fichier, ils ne vont jamais aller ouvrir un sujet intitulé "De nombreux View Controllers" pour trouver la réponse. S'ils font une recherche pour espérer trouver une réponse si quelqu'un a déjà  posé la question, ils ne tomberont jamais sur ce sujet. Pense un peu communautaire image/wink.png' class='bbc_emoticon' alt=';)' />



    D'ailleurs si tu avais déjà  ce réflexe... tu aurais toi-même fait une recherche sur le sujet, car il me semble qu'on a justement déjà  répondu à  ce genre de question de comment sauvegarder une hiérarchie d'objets dans un fichier...
  • Je te remercie pour ces précisions
Connectez-vous ou Inscrivez-vous pour répondre.