2010-07-26 7 views
2

J'ai un projet avec plusieurs cibles. Pour la plupart de mes classes, je peux utiliser un seul fichier .h et modifier les détails dans le fichier .m (en ajoutant un fichier .m différent pour chaque cible).Comment puis-je utiliser des fichiers .h différents pour plusieurs cibles?

Pour l'une de mes sous-classes UIViewController, je dois déclarer différents UILabel IBOutlet s pour les différentes cibles (chaque cible affiche un jeu d'étiquettes différent en fonction de ce qui est disponible). Le problème est que les fichiers d'en-tête ne peuvent pas être ciblés. Il n'y a pas de case à cocher à côté d'eux pour spécifier l'appartenance à la cible.

La façon dont j'ai traité ceci est juste d'ajouter des points de vente pour toutes les cibles et ignorer les non utilisés. Cela ne semble pas idéal.

Dois-je utiliser une phase de construction d'en-tête pour cela? Quelle est la meilleure façon de gérer ce problème? Merci.

Editer: J'aurais dû mentionner que je veux que tous les fichiers .h aient le même nom: PlaceViewController.h.

+0

La solution que vous avez trouvée va seulement mener à la folie. Vous ne devriez pas avoir plusieurs en-têtes portant le même nom que vous planifiez, car cela entraînerait probablement des erreurs et des problèmes de maintenance dans le futur. Je recommande d'utiliser un en-tête nommé unique pour chaque cible, et d'inclure le bon en fonction des directives du préprocesseur, comme déjà décrit dans les réponses. Cela vous aidera à garder votre santé mentale un peu plus longtemps. –

Répondre

3

Vous pouvez utiliser des directives de préprocesseur pour inclure sélectivement les fichiers d'en-tête. Par exemple

#if TARGET_OS 
    #import "FirstTarget.h" 
#else 
    #import "SecondTarget.h" 
#endif 

Vous pouvez utiliser des dossiers différents pour les différentes cibles si les en-têtes sont le même nom:

#if TARGET_OS 
    #import "First/Target.h" 
#else 
    #import "Second/Target.h" 
#endif 

Vous pouvez en savoir plus sur conditionalshere.

+0

Désolé, j'aurais dû dire que je veux que les en-têtes aient le même nom. –

+0

@nevan J'ai mis à jour la réponse. – Shaji

1

Les en-têtes ne sont pas compilés eux-mêmes, mais sont inclus dans d'autres fichiers qui sont ensuite compilés. Vous pouvez utiliser la compilation conditionnelle dans ces fichiers pour inclure les en-têtes appropriés pour la cible. Définir un symbole unique dans les symboles de préprocesseur pour chaque cible, et inclure les en-têtes appropriés en conséquence:

#if defined(TARGET_ONE) 
#include "HeaderOne.h" 
#elif defined(TARGET_TWO) 
#include "HeaderTwo.h" 
#endif 
+0

Désolé, j'aurais dû dire que je veux que tous mes en-têtes aient le même nom. J'ai édité ma question ci-dessus. –

+0

La seule façon de procéder est de placer les en-têtes dans les sous-répertoires, puis de modifier vos chemins de recherche pour chaque cible afin d'inclure le sous-répertoire correct. En bas, c'est la folie. Je recommande fortement de ne pas faire ce que vous essayez de faire et de trouver une meilleure solution. Séparer les fichiers (avec des noms uniques) par cible est probablement un bon point de départ. –

0

Je suis désolé d'être répondre à quelques années trop tard, mais j'ai eu récemment le même problème, et il y a une façon de le faire:

  • Disons que vous avez déjà créé une nouvelle cible en dupliquant la cible d'origine. Cliquez avec le bouton droit sur le premier fichier (original) .h dans le navigateur de projet et ouvrez le fichier dans le Finder.
  • Dans Xcode, cliquez avec le bouton droit sur le fichier et supprimez-le du projet (supprimez uniquement la référence, ne déplacez pas vers la corbeille).
  • Dans Finder, créez deux dossiers (vous ne pouvez pas avoir deux fichiers portant le même nom dans un seul dossier) et déplacez/copiez le fichier original .h dans les deux dossiers.
  • Maintenant, glissez-déposez le premier dossier quelque part dans votre projet, et lorsque la fenêtre avec les cibles apparaît, sélectionnez uniquement la première cible.
  • Même avec le second dossier, sélectionnez uniquement la deuxième cible.

Voilà, vous devriez maintenant avoir deux fichiers .h du même nom. Avertissements: il semble que Xcode a des problèmes aléatoires si votre fichier .h a un NS_ENUM. C'est probablement résoluble, mais je ne l'ai toujours pas compris.