2009-04-19 14 views
17

J'ai passé du temps à apprendre à utiliser le SDK iPhone. J'ai lu "Beginning iPhone Development: Exploring the iPhone SDK" de la couverture à la couverture et je n'ai jamais vu un exemple de plusieurs vues au sein d'un XIB.Plusieurs vues au sein d'un XIB - SDK iPhone

Pour illustrer ce que je veux dire, voici une capture d'écran d'un XIB avec la configuration simple de ce que je fais référence à:

alt text http://theopensourceu.com/wp-content/uploads/2009/04/one-xib-multiple-views.png

je me dis que qu'il doit y avoir une raison très spécifique que je n'ai jamais vu ça. Dans les exemples d'Apple et dans toutes mes lectures jusqu'à maintenant, plusieurs XIB sont utilisés avec une seule «vue» (et parfois le contrôleur de navigation ou un contrôleur de barre d'onglets, etc.). Quelle est la raison pour ça? Devrais-je éviter plusieurs vues à l'intérieur d'un XIB? Quels sont les avantages ou les inconvénients de l'une ou l'autre méthode?

Nous vous remercions à l'avance

Répondre

21

Il est une question d'optimisation de la mémoire et les temps de chargement. Si vous placez toutes vos vues dans un XIB, lorsque votre application se lance, elle doit charger la totalité de XIB en mémoire et construire tous les objets pour tous les contrôles, ce qui prend une durée non négligeable. Si à la place vous séparez vos vues en XIB séparés, alors votre application démarrera beaucoup plus rapidement, car seule la XIB contenant la vue initiale sera chargée, et elle utilisera également moins de mémoire au début. Ensuite, lorsque la vue change, vous pouvez charger paresseusement la XIB contenant la nouvelle vue. Cela entraînera un problème mineur lors de l'ouverture d'une vue pour la première fois. Si vous essayez vraiment d'optimiser l'utilisation de la mémoire, vous pouvez également décharger la vue précédente lorsque vous changez de vue, mais je ne le recommanderais pas, car cela entraînera un accrochage chaque fois que vous changez de vue, au lieu de la première fois vous passez à une vue donnée.

+0

Je ne suis pas un peu clair sur la distinction entre "vue" et XIB ici. Pour un (vrai) exemple, disons que je dois implémenter quelque chose avec une vue de carte en haut, 3 boutons en bas, et différents contrôles au milieu en fonction d'une condition. Ce milieu pourrait être un.) Les étiquettes, formatées d'une manière particulière, ou b.) Une image et moins d'étiquettes, formatées d'une manière différente. Ma pensée était de 3 vues - une vue pour gérer chacun de ces groupes de contrôles (carte, contrôles conditionnels, boutons). Est-il préférable de faire 3 vues dans un XIB ou simplement de mettre tous les contrôles dans une vue? – Danny

+0

Bien sûr, vous ne devriez pas mettre * chaque * vue dans un seul XIB, mais il a demandé s'il y avait une raison pour laquelle vous ne devriez pas le faire du tout. Il y a certainement des moments où c'est utile. –

4

Suite à la réponse précédente, il y a des moments où vous souhaitez charger plusieurs vues en même temps. Voici un exemple: Vous affichez un rapport avec plusieurs pages et vous allez utiliser un UIScrollView pour les gérer. Lorsque l'utilisateur aura fini de parcourir le rapport, il fermera le rapport qui fermera la vue.

Créez un UIScrollView dans un XIB avec un UIView pour chaque page dont vous avez besoin. Puisque les UIViews font partie de la XIB, ils seront chargés en mémoire ensemble, en même temps, lorsque le rapport est ouvert. Créez deux UIViewControllers et utilisez-les pour afficher la page en cours de visualisation et la page défilée. Lorsque l'utilisateur parcourt les pages, réutilisez le UIViewController sur la page en cours de défilement pour maintenir la page défilée.

Ceci assurera une grande performance pendant que l'utilisateur feuillette les pages. Il charge toutes les pages à la fois en mémoire. Je n'utilise que deux UIViewControllers, et il change juste les vues qui s'y trouvent et les déplace.

Cela a également l'avantage d'avoir toutes les pages dans un XIB. Il est plus facile à modifier et plus rapide à charger que les XIB séparés. Vous devez juste vous assurer que vous avez la mémoire pour charger toutes les pages à la fois. Si c'est un contenu statique (comme dans mon cas) c'est un excellent moyen d'y aller.

Si vous cherchez un bon exemple de la façon de procéder, je trouve cette ressource pour être un excellent point de départ:

http://cocoawithlove.com/2009/01/multiple-virtual-pages-in-uiscrollview.html

1

Ceci est un avertissement à tous ceux qui essaient de mettre en œuvre le paysage et portrait avec deux vues dans un seul XIB (iOS 4 avec Xcode 4).L'inconvénient principal d'avoir deux vues dans un seul XIB - pour moi - était que vous ne pouvez connecter qu'un seul objet UIOutlet dans un XIB à un seul objet UIOutlet dans un contrôleur de vue. Par exemple, si vous avez un XIB avec une vue pour le paysage et une vue pour le portrait, les deux vues contiennent les mêmes objets d'interface dans différentes positions (comme un UILabel en paysage et un UILabel en portrait). Il n'est pas possible de lier UILabel dans votre vue de portrait et l'objet UILabel dans la vue de paysage à un seul objet UILabel dans le contrôleur de vue en même temps. Je trouve cela décevant, car la documentation iOS UIViewController (iOS 4.3) suggérait que je puisse implémenter des vues paysage et portrait personnalisées en basculant entre deux vues par programmation lorsque l'écran tourne. Après avoir passé un certain temps à comprendre comment faire cela, j'ai découvert qu'il est possible d'avoir deux vues différentes attachées à un seul contrôleur de vue, mais vous devez avoir des prises pour les deux vues. Par exemple, dans mon contrôleur de vue, j'ai deux objets UILabel (un pour se connecter à un UILabel dans la vue portrait, un pour se connecter à un UILabel dans la vue paysage). Dans mon code, chaque fois que je mets à jour la prise de paysage, je mets aussi à jour le paysage du portrait.

Pas très élégant, mais cela fonctionne, et comme il s'agit d'une vue simple avec un écran, il n'utilisera pas trop de mémoire pour avoir tous les objets de l'interface utilisateur dupliqués dans le contrôleur et les vues. Je ne créerais pas un projet qui le ferait de nouveau, mais c'était une bonne solution pour ce projet.