27 votes

Est-il sage de "nid" UIViewControllers à l'intérieur d'autres UIViewControllers comme vous le feriez UIViews?

J'ai une assez complexe, pour moi en tout cas, qui a un peu de "plateaux" avec interface personnalisée des articles sur eux. Ils glissent dans et hors de ma vue racine. J'aimerais nid (addSubview) les éléments à l'intérieur de la vue. Chacun a besoin d'une certaine configuration avant d'être affiché...et aucun ne peut être configuré dans l'IB (ils sont des sous-classes de UIView).

Je me demande si elle fait sens à la sous-classe UIViewController pour chaque "bac" et alors le CR de la propriété view point pour le "plateau" vue que je peut remplir avec mon custom UIView objets. De cette façon, je peux tirer le viewDidLoad, etc... méthodes de UIViewController.

Je ne suis pas au courant d'autres à faire cela au moins dans les quelques échantillons que j'ai regardé. Il serait de créer une situation où il y aurait plusieurs contrôleurs de vue affichée sur l'écran à la fois. à partir de la manette de Navigation elle-même est sur le rootViewController et son point de vue et ensuite n'importe quel nombre (ainsi, la taille de l'écran le permet) de ces petites trayViewControllers. Si oui, comment est le répondeur de travail à la chaîne? je suppose qu'il faudrait aller plus bas UIView à son enveloppant VC, puis à celle de VC en vue parent, alors que la vue VC, etc. etc. répéter, répéter.. jusqu'à UIApplication... suis-je d'avoir des ennuis?

OU, dois-je viens de coller avec UIViews et en ajoutant des sous-vues dans les sous-vues, etc. etc..

28voto

Jason Harwig Points 9925

Avant iOS 5.0 ce sera spécifiquement non recommandée, car l'affichage imbriqué contrôleurs événements de cycle de vie – viewWillAppear, etc. – ne sera pas appelé. Voir Abuser De UIViewControllers.

Avec plusieurs UIViewController de vues visible à la fois certains de ces contrôleurs ne peuvent pas recevoir des messages importants comme -viewWillAppear: ou -didReceiveMemoryWarning. En outre, certaines de leurs propriétés comme parentViewController et interfaceOrientation ne peut pas être créé ou mis à jour comme prévu.

iOS 5.0 ajouté confinement UIViewControllers qui gère correctement ces événements de cycle de vie par l'ajout de la vue enfant contrôleurs.

- (void)addChildViewController:(UIViewController *)childController

J'ai passé d'innombrables heures à essayer d'obtenir affichage imbriqué contrôleurs de travailler dans l'iOS 4. Je l'ai finalement fait, mais il a exigé beaucoup de colle le code qui a été facile de se tromper. Puis j'ai vu l'avertissement dans les docs.

7voto

tba Points 1754

Je suis en train de faire la même chose, mais a été dissuadés de votre approche par Apple de la documentation, qui stipule que "Vous ne devez pas utiliser la vue des contrôleurs pour gérer les vues qui remplissent qu'une partie de leur fenêtre, à une partie seulement de la zone définie par le contenu de l'application un rectangle. Si vous voulez avoir une interface composée de plusieurs petites vues, de les intégrer tous dans une seule vue de la racine et de gérer ce point de vue avec votre point de vue contrôleur".

1voto

nico Points 2482

Mon expérience sur ce que vous essayez de faire a été un bon. J'essaie de garder les fichiers nib aussi simple que possible, donc je prends tout posible "sous-vue" et de l'encapsuler dans sa propre plume fichier avec-vue-contrôleur, donc je finis par avoir imbriqué vue des contrôleurs. Dans une de mes applications, j'ai une question très complexe de la vue de la table de la cellule, qui est une sous-vue. Alors j'ai fini par avoir une hiérarchie qui va comme ceci: la tableview contrôleur sur le haut niveau, la tableviewcell de contrôleurs pour chaque ligne et à l'intérieur de chacun d'eux, un subviewcontroller pour la sous-vue à l'intérieur de chaque cellule.

Et tout fonctionne bien.

Pardon pour mon anglais.

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