Application universelle iPhone/iPad: oui mais...
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:
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:
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:
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 ?
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]@"%@~%@"[/color], [color=#d1342a]@"ActionsViewController"[/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 ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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.
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...) ?
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.
Idem pour la distinction iPhone/iPad, j'avais un SharedMachinViewController, MachinViewController et un MachinViewControllerIPad.
Et faire le choix en conséquence.
Merci.