49 votes

iOS: Utilisation de modificateurs de périphérique pour charger des fichiers xib?

Vous pouvez utiliser un appareil modificateur (c'est à dire, ~ipad) afin de fournir un dispositif-clé spécifique dans Info.plist, et pour spécifier un périphérique spécifique lancement de l'image (par Défaut.le format png pour iPhone, et par Défaut~ipad.le format png pour iPad, par exemple). Ces deux choses sont spécifiquement mentionnés dans Apple Docs, mais ils ne disent pas que cela fonctionnera pour tout autres types de fichiers.

J'ai découvert (par hasard) que cela fonctionne pour le chargement .xib fichiers via initWithNibName:bundle:. Ainsi, par exemple, je peux avoir Mavue.xib et Mavue~ipad.xib, et ce code:

MyViewController *viewController = [[MyViewController alloc] 
                                     initWithNibName:@"MyView" bundle:nil];

... totalement la charge de Mavue~ipad.xib sur un iPad, et Mavue.xib sur d'autres appareils.

Donc, 1) Est-ce documenté quelque part? Je ne pouvais pas trouver n'importe quel Apple docs. C'est sûr que plus maniable que la vérification de UI_USER_INTERFACE_IDIOM() et de coder en dur les deux différents noms de plume partout, mais j'ai un peu de ne pas lui faire confiance si elle n'est pas documenté.

Et, 2) personne Ne sait quelle est la version de l'iOS cela a commencé à travailler? J'ai seulement essayé en 4.2, et ça fonctionne. Appareil modificateurs en général (même pour la documentation de choses énumérées ci-dessus) sont 4.0 minimum.

50voto

Kenny Wyland Points 6518

J'ai eu ce même problème. La réponse n'a pas de sens au premier abord, mais la bonne nouvelle, c'est que c'est facile à faire! :)

Juste le nom de votre iPad xibs sans aucun modificateur et votre iPhone xibs avec ~iphone modificateur et il vous sélectionnez correctement.

Ainsi, avec MyViewController, vous devrez MyViewController.xib pour l'iPad et l' MyViewController~iphone.xib pour l'iPhone. Ensuite, vous pouvez simplement init votre vue-contrôleur avec de simples alloc/init.

[[MyViewController alloc] init] , et il va attraper le droit xib.

Donc, quand je crée un nouveau point de vue contrôleur dans XCode, je choisis toujours la boîte de format pour ipad, car le xib il va créer va être nommé MyViewController.xib et vous voulez que l'iPad de taille xib. Puis-je créer un deuxième xib, formaté pour l'iPhone et le nom avec le ~iphone modificateur.

La documentation est un peu contradictoire, à la fois, mais cette page parle de la façon dont les ressources avec un identifiant par défaut à l'iPad.

ImageSoundResources

Voir la section sur l'utilisation de la haute résolution des images. Je sais que nous parlons xibs et pas des images, mais il fonctionne. Mon dernier 6 apps, tous ont utilisé cet idiome.

25voto

Caleb Shay Points 1316

En fait, il est explicitement définie dans les docs, mais comme une note de bas de page.

CocoaNibs

Dans la note au bas de la "Chargement de la PLUME de fichiers à l'aide NSBundle":

Remarque: Si vous êtes l'élaboration d'un Application universelle pour iOS, vous pouvez utiliser le dispositif spécifique de nommage conventions pour charger le bon de plume fichier pour le périphérique sous-jacent automatiquement. Pour plus d'informations sur la façon de nommer vos fichiers nib, voir "iOS prend en charge Spécifique à l'Appareil Les ressources."

Qui liens de Cacao Conceptuel LoadingResources

Cependant, oui, c'est un 4.0+ only.

3voto

zpasternack Points 10563

Je déteste être ce gars et répondre à ma propre question, mais je pense que la réponse est:

1) Nope, non explicitement documenté dans aucune documentation Apple, et
2) 4.0 et supérieur (basé sur mes propres tests)

Tout ce que vous enregistrez réellement est quelques lignes de code vérifiant UI_USER_INTERACE_IDIOM (). Pourtant, je vais le prendre. Moins de code est moins de code.

2voto

Wayne Hartman Points 8701

La technique appropriée à utiliser dans iOS 3.2 et versions ultérieures est la fonction UI_USER_INTERFACE_IDIOM() . J'utilise généralement un opérateur ternaire pour initialiser les UIViewController avec le XIB approprié.

 UIViewController* controller = [[UIViewController alloc] 
    initWithNibName:UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? 
    @"YourViewController-iPad" : @"YourViewController" andBundle:nil];
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X