Application universelle iPhone/iPad: oui mais...

muqaddarmuqaddar Administrateur
Salut,



Je suis en train de passer une application en "universal".



Avant je faisais ça, ayant 2 applications, j'utilisais les "preprocessor macros" à  la compilation utilisant la même classe:






<br />
[color=#784a32]#ifdef TARGET_OS_PAD[/color]<br />
  [color=#b9369d]code...[/color]<br />
[color=#784a32]#endif[/color]<br />
  <br />
<br />
[color=#784a32]#ifdef TARGET_OS_PHONE [/color]<br />
  code...<br />
[color=#784a32]#endif  [/color]<br />




Idem dans le .h, où on peut utiliser des macros à  la compilation.





Aujourd'hui, en app universelle, il faut utiliser les conditions au runtime:



Exemple dans AppDelegate:






<br />
[color=#008123][color=#000000]  [/color]// view controllers[/color]<br />
[color=#784a32][color=#000000]  [/color][color=#b9369d]if[/color][color=#000000] [/color]USER_IPAD[/color]<br />
  {<br />
[color=#4f8085][color=#000000]	[[/color][color=#b9369d]self[/color][color=#000000].[/color]window[color=#000000] [/color][color=#3f277d]addSubview[/color][color=#000000]:[/color][color=#b9369d]self[/color][color=#000000].[/color]finderViewController[color=#000000].[/color][color=#6f43a4]view[/color][color=#000000]];  [/color][/color]<br />
  }<br />
[color=#784a32][color=#000000]  [/color][color=#b9369d]if[/color][color=#000000] [/color]USER_IPHONE[/color]<br />
  {<br />
[color=#4f8085][color=#000000]	[[/color][color=#b9369d]self[/color][color=#000000].[/color]window[color=#000000] [/color][color=#3f277d]addSubview[/color][color=#000000]:[/color][color=#b9369d]self[/color][color=#000000].[/color]navigationController[color=#000000].[/color][color=#6f43a4]view[/color][color=#000000]];  [/color][/color]<br />
  }<br />






sachant que USER_IPAD est une macro perso qui fait :

if user_interface_idiom_pad... bla bla.



Bon, donc on se retrouve à  :

- déclarer des properties dans le .h qui ne seront pas utilisées suivant le contexte, idem pour leurs accesseurs

- idem pour les outlets qui pointent vers l'un ou l'autre des 2 xibs

- et pire pour des méthodes destinées à  l'un ou l'autre des devices comme:





[/color]<br />
[color=#784a32]#ifdef TARGET_OS_PHONE[/color]<br />
- ([color=#b9369d]IBAction[/color])loadActions:([color=#b9369d]id[/color])sender<br />
{<br />
ActionsViewController *actionsViewController = [[ActionsViewController alloc] initWithNibName:[NSString stringWithFormat:[color=#d1342a]@&quot;%@~%@&quot;[/color], [color=#d1342a]@&quot;ActionsViewController&quot;[/color], DEVICE] bundle:[color=#b9369d]nil[/color]];<br />
<br />
  UINavigationController *uiNavigationController = [[UINavigationController alloc] initWithRootViewController:actionsViewController];<br />
  [[color=#b9369d]self[/color] presentModalViewController:uiNavigationController animated:[color=#b9369d]YES[/color]];<br />
  [uiNavigationController release];  <br />
  <br />
[actionsViewController release];  <br />
}<br />
[color=#784a32]#endif[/color]<br />




Ces méthodes seront compilées puisque je vais virer les preprocessors macros, et ne serviront que dans l'un ou l'autre des devices.



Bref, tout ça alourdit les binaires, et dans une moindre mesure, utilise + de mémoire.



Ma question est simple: est-ce l'unique bonne façon de faire une app universelle ?

Réponses

  • AliGatorAliGator Membre, Modérateur
    Bah je comprends pas, il faut bien que le code soit dispo dans le binaire pour les deux cas, donc oui c'est l'unique façon de faire que de laisser les deux codes, y'a rien de magique...



    Après côté architecture logicielle tu peux éventuellement mieux séparer ton interface de ton métier, quitte à  utiliser des classes métier qui ont du code commun, et des ViewControllers séparés pour iPhone/iPad (quitte à  avoir un parent avec le code commun, et des classes dérivées pour chaque déclinaison iPhone/iPad), et instancier la bonne classe par code ensuite selon le cas au runtime. En terme de lecture de code ça sera peut-être plus compréhensible.
  • muqaddarmuqaddar Administrateur
    Pour le point 1) je suis d'accord.



    Pour le 2), mon interface est déjà  bien séparée de mon métier, mais pour les view controllers, je n'y avais pas trop pensé. Vous êtes nombreux à  utiliser l'héritage sur vos view controllers (pas ceux d'Apple hein...) ?
  • AliGatorAliGator Membre, Modérateur
    mars 2012 modifié #4
    Oui moi par exemple j'ai un FeedViewController générique pour gérer mes listes de plats, qui est dérivé en différents ViewControllers suivant si c'est la liste des plats d'un utilisateur (avec l'en-tête qui va bien pour afficher les infos de l'utilisateur), d'un resto (idem), les plats récents, ...



    Par contre jamais fait d'appli Universelle donc jamais mis en pratique ce que je te conseille à  savoir faire une sous-classe pour iPhone et une pour iPad.
  • BunoBuno Membre
    Yop,

    Idem pour la distinction iPhone/iPad, j'avais un SharedMachinViewController, MachinViewController et un MachinViewControllerIPad.
  • muqaddarmuqaddar Administrateur
    En fait, ça dépend du contenu de la classe et de la quantité de code destinée à  l'un ou l'autre des devices.

    Et faire le choix en conséquence.



    Merci.
Connectez-vous ou Inscrivez-vous pour répondre.