2010-10-03 7 views
4

Je suis confus sur les contrôleurs de vue et aimerais un exemple direct. Voici le préambule:Gérer plusieurs UIViews à partir d'un UIViewController

J'ai un UIViewController avec un .xib correspondant. Par défaut, IB me donne une vue unique dans la fenêtre de document. Je peux le faire apparaître en disant mon UIWindow à addSubview:controller.view et bringSubviewToFront:controller.view

est ici les questions suivantes:

  1. Dois-je ajouter une autre Voir la ViewController dans IB? Ou y a-t-il une meilleure façon, programmatique? Comment puis-je dire au ViewController de passer d'une vue à l'autre?

  2. Depuis le ViewController vers le bas, à quoi ressemble le code pour atteindre cet objectif?

J'essaie des choses, mais juste faire un gâchis si je pensais arrêter et demander ...

Répondre

7

Notez que chaque bouton, étiquette, image, etc. dans votre contrôleur principal de vue est En fait, c'est une vue en soi, mais j'ai interprété votre question comme signifiant que vous voulez gérer plusieurs vues en plein écran ou «écrans». Chaque écran devrait avoir son propre contrôleur de vue pour le gérer. Donc, pour avoir la terminologie correcte, un view-controller est un objet qui gère une seule vue plein écran (ou presque plein écran s'il est imbriqué dans un contrôleur de navigation ou un contrôleur de barre d'onglets par exemple) et une vue est la grande zone gérée par le contrôleur de vue ainsi que toutes les sous-vues (images, boutons, étiquettes, etc.) à l'intérieur (ce sont toutes des sous-classes UIView). Le contrôleur de vue gère tous les sur cet écran, si vous voulez un autre écran/page, vous devez créer un nouveau contrôleur de vue pour le gérer. Le contrôleur de vue racine (celui que vous ajoutez à la fenêtre) peut être un ancien contrôleur de vue normale que vous avez conçu dans IB, mais il est probablement plus utile si vous utilisez un contrôleur de navigation ou un contrôleur de barre d'onglets. ajoutez votre contrôleur de vue conçu à cela - alors vous pouvez pousser des contrôleurs de vue supplémentaires au besoin. Une autre façon (si vous ne voulez pas de style de navigation ou de tabulation) serait de passer à d'autres contrôleurs de vue directement dans la fenêtre principale en utilisant les transitions que vous voulez (ou simplement remplacer l'ancien). Nous allons laisser cela pour l'instant cependant. Toutes les sous-vues de votre contrôleur de vue principal (celui que vous avez conçu dans IB) seront automatiquement chargées à partir du fichier nib, mais vous pouvez également ajouter vos propres vues par programme si vous le souhaitez (en général, vous utiliserez un ou l'autre, c'est-à-dire les plumes ou par programme, mais vous pouvez mélanger et assortir si vous voulez). Pour le faire par programme, remplacez loadView dans le contrôleur de vue, puis appelez [super loadView]; puis faites [self.view addSubView:myOtherView]; (créez d'abord le myOtherView). Notez que la première fois .view est accessible sur votre contrôleur de vue, il appelle en fait loadView pour créer la vue, donc à l'intérieur loadView il est important d'appeler [super loadView]; avant d'essayer d'accéder self.view: D

Pour basculer entre les vues, en utilisant la navigation ou contrôleurs de barre d'onglet le rend très facile. Mettez donc votre contrôleur de vue principal à l'intérieur (par exemple) d'un contrôleur de navigation et placez le contrôleur de navigation dans la fenêtre, vous avez donc window-> navigationController-> myController.Ensuite, à partir d'une méthode d'action dans votre contrôleur de vue (vous pouvez brancher les méthodes d'action dans IB), par exemple lorsqu'un « sur les » bouton est pressé faire:

- (void)doAbout 
{ 
    // Create the about view controller 
    AboutViewController* aboutVC = [AboutViewController new]; 
    // Push the view controller onto the navigation stack 
    [self.navigationController pushViewController:aboutVC animated:YES]; 
    [aboutVC release]; 
} 

Notez que le contrôleur de vue au sujet est créé programatically ici - si votre vue à propos de est conçu dans IB, utilisez plutôt initWithNibName:bundle: pour le créer.

Et c'est ainsi que vous gérez plusieurs écrans.

+0

"un view-controller est un objet qui gère une seule vue en plein écran" ... pas vraiment, il est tout à fait valide d'avoir plusieurs view-controllers enfants dans un container pour supporter une hiérarchie de vue; cela permet de garder le code plus court aussi. –

+0

Oui, vous avez raison. Cette réponse a été écrite en 2010 - je ne sais pas si c'était avant ou après que les conteneurs de contrôleurs de vue aient été rendus disponibles dans l'API publique, mais de toute façon je pense que c'est un sujet avancé et compte tenu du niveau de compréhension D probablement encore répondre de cette façon aujourd'hui. Ce n'est qu'une fois que vous avez compris qu'un contrôleur de vue gère une collection de vues que vous devez passer à la compréhension des contrôleurs de vue de conteneur gérant d'autres contrôleurs de vue. – jhabbott

Questions connexes