web-dev-qa-db-fra.com

Comment ajouter une vue ViewController en tant que sous-vue

Remarque aux googleurs, cette question est maintenant six ans plus tard !

Comme Micky ci-dessous et d'autres l'ont mentionné, cela se fait désormais tous les jours avec Containers sur iOS.


J'ai un ViewController qui contrôle beaucoup de sous-vues. Lorsque je clique sur l’un des boutons, j’initialise un autre contrôleur de vue et l’affiche comme sous-vue de cette vue. Cependant, la sous-vue dépasse les limites du cadre pour la sous-vue et en fait, elle remplit tout l'écran.

Quel pourrait être le problème? Je suppose que le problème est que la vue d'UIViewController a un cadre (0,0320,460) et remplit donc tout l'écran (bien qu'elle ne reçoive les événements tactiles que si elle est touchée dans les limites du cadre de sous-vue). Comment puis-je redimensionner le cadre pour l'adapter en tant que sous-vue.

En bref, j'ai besoin d'aide pour ajouter la vue d'un contrôleur de vue en tant que sous-vue à la vue d'un autre contrôleur de vue.

Merci!

73
sperumal

Depuis iOS 5 , Apple vous permet maintenant de créer des conteneurs personnalisés dans le but d'ajouter un UIViewController à un autre UIViewController, notamment via des méthodes telles que addChildViewController so il est en effet possible d'imbriquer UIViewControllers

EDIT: Y compris le résumé sur place afin d'éviter la rupture de lien

Je cite:

iOS fournit de nombreux conteneurs standard pour vous aider à organiser vos applications. Cependant, vous devez parfois créer un flux de travail personnalisé qui ne correspond à celui fourni par aucun des conteneurs système. Peut-être que votre vision nécessite une organisation spécifique de contrôleurs de vue enfant avec des mouvements de navigation spécialisés ou des transitions d'animation entre eux. Pour cela, vous implémentez un conteneur personnalisé - En savoir plus ...

...et:

Lorsque vous concevez un conteneur, vous créez des relations parent-enfant explicites entre votre conteneur, le parent et les autres contrôleurs de vue, ses enfants - En savoir plus

Exemple (courtoisie de Apple Docs) Ajout de la vue d’un autre contrôleur de vue à la hiérarchie de vues du conteneur

- (void) displayContentController: (UIViewController*) content
{
   [self addChildViewController:content];                 
   content.view.frame = [self frameForContentController]; 
   [self.view addSubview:self.currentClientView];
   [content didMoveToParentViewController:self];          
}

À votre santé,

Micky Duncan

86
MickyD

Grâce à ces gars, je l'ai fait http://highoncoding.com/Articles/848_Creating_iPad_Dashboard_Using_UIViewController_Containment.aspx

Ajoutez UIView, connectez-le à l'entête: 

@property (weak, nonatomic) IBOutlet UIView *addViewToAddPlot;

Dans - (void) viewDidLoad fait ceci:

ViewControllerToAdd *nonSystemsController = [[ViewControllerToAdd alloc] initWithNibName:@"ViewControllerToAdd" bundle:nil];
    nonSystemsController.view.frame = self.addViewToAddPlot.bounds;
    [self.addViewToAddPlot addSubview:nonSystemsController.view];
    [self addChildViewController:nonSystemsController];
    [nonSystemsController didMoveToParentViewController:self];

Prendre plaisir

41
Naloiko Eugene

Cette réponse est correcte pour les anciennes versions d'iOS, mais est maintenant obsolète. Vous devriez utiliser la réponse de Micky Duncan, qui couvre les conteneurs personnalisés.

Ne fais pas ça! L’intention de UIViewController est de gérer tout l’écran. Ce n'est tout simplement pas approprié pour cela, et cela n'ajoute pas vraiment tout ce dont vous avez besoin.

Tout ce dont vous avez besoin est un objet qui possède votre vue personnalisée. Utilisez simplement une sous-classe de UIView elle-même, de sorte qu'elle puisse être ajoutée à votre hiérarchie de fenêtres et que la gestion de la mémoire soit entièrement automatique.

Pointez le propriétaire de la sous-vue NIB sur une sous-classe personnalisée de UIView. Ajoutez une sortie contentView à cette sous-classe personnalisée et pointez-la sur la vue située dans la pointe. Dans la sous-classe personnalisée, procédez comme suit:

- (id)initWithFrame: (CGRect)inFrame;
{
    if ( (self = [super initWithFrame: inFrame]) ) {
        [[NSBundle mainBundle] loadNibNamed: @"NibNameHere"
                                      owner: self
                                    options: nil];
        contentView.size = inFrame.size;
        // do extra loading here
        [self addSubview: contentView];
    }
    return self;
}

- (void)dealloc;
{
    self.contentView = nil;
    // additional release here
    [super dealloc];
}

(Je suppose ici que vous utilisez initWithFrame: pour construire la sous-vue.)

26
Steven Fisher

J'ai l'impression que toutes ces réponses sont légèrement incomplètes, alors voici la bonne façon d'ajouter la vue d'un viewController en tant que sous-vue d'un autre viewController:

    [self addChildViewController:viewControllerToAdd];
    [self.view addSubview:viewControllerToAdd.view];
    [viewControllerToAdd didMoveToParentViewController:self];

Si vous le souhaitez, vous pouvez le copier dans votre code sous forme d'extrait. SO ne semble pas comprendre le format de remplacement de code, mais il apparaîtra comme vierge dans Xcode:

    [self addChildViewController:<#viewControllerToAdd#>];
    [self.view addSubview:<#viewControllerToAdd#>.view];
    [<#viewControllerToAdd#> didMoveToParentViewController:self];

willMove est appelé automatiquement w/addChild. Merci @iOSSergey

Lorsque votre conteneur personnalisé appelle la méthode addChildViewController:, il appelle automatiquement la méthode willMoveToParentViewController: du contrôleur de vue à ajouter en tant qu'enfant avant de l'ajouter.

16
Logan

Utilisation:

[self.view addSubview:obj.view];
6
rahul gupta

Modifiez la taille d'image de viewcontroller.view.frame, puis ajoutez-la à la sous-vue. [viewcontrollerparent.view addSubview:viewcontroller.view]

1
CiNN

Vous devez définir les propriétés des limites pour qu'elles correspondent à ce cadre. encadrer ses propriétés superview, et les limites limitent le cadre dans le système de coordonnées de la vue elle-même.

0
bolek