web-dev-qa-db-fra.com

ajouter UIViewController dans la sous-vue

Je ne sais pas si c'est la bonne clé pour rechercher "ajouter UIViewController dans la sous-vue" . Comme vous pouvez le voir dans mon image, il y a deux ViewController, le contrôleur principal et le second. À l'intérieur du contrôleur principal, il y a un UIView (couleur d'arrière-plan bleue). À l'intérieur de UIView, je veux ajouter le deuxième ViewController dans mon UIView. J'ai ce code mais cela n'a pas fonctionné. 

enter image description here

voici mon code

#import "ViewController.h"
#import "SampleViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *testView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    SampleViewController * sample = [[SampleViewController alloc] initWithNibName:@"SampleViewController" bundle:nil];
    sample.view.frame = CGRectMake(0, 0, self.testView.bounds.size.width, self.testView.bounds.size.height);
    [self.testView addSubview:sample.view];
} 

@end

Je veux savoir si c'est possible? Je sais que initWithNibName: fonctionne dans un fichier xib, je ne connais pas le terme exact pour rechercher dans Google à ce sujet. J'essaie simplement d'expérimenter quelque chose si cela est possible dans IOS. En espérant que vous comprenez ce que j'essaye de faire. En espérant vos conseils. Merci d'avance

voici ma mise à jour

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *testView;
@property(strong,nonatomic) SampleViewController * samples;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

UIStoryboard *storyBoard = self.storyboard;
SampleViewController * sample = [storyBoard instantiateViewControllerWithIdentifier:@"SampleViewController"]; 
// SampleViewController * sample = [[SampleViewController alloc] //initWithNibName:@"SampleViewController" bundle:nil];

[self displayContentController:sample];
//commented the below line because it is not needed here, use it when you want to remove        
//child view from parent.
 //[self hideContentController:sample];

}

- (void) displayContentController: (UIViewController*) content;
{
    [self addChildViewController:content];                 // 1
    content.view.bounds = self.testView.bounds;                 //2
    [self.testView addSubview:content.view];
    [content didMoveToParentViewController:self];          // 3
}


- (void) hideContentController: (UIViewController*) content
{
    [content willMoveToParentViewController:nil];  // 1
    [content.view removeFromSuperview];            // 2
    [content removeFromParentViewController];      // 3
}

J'ai toujours cette erreur 

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/ace/Library/Developer/CoreSimulator/Devices/035D6DD6-B6A5-4213-9FCA-ECE06ED837EC/data/Containers/Bundle/Application/EB07DD14-A6FF-4CF5-A369-45D6DBD7C0ED/Addsubviewcontroller.app> (loaded)' with name 'SampleViewController''

Je pense, sa recherche d'une plume. Je n'ai pas mis en place une plume ici.

12
user3818576

Vous devez utiliser le concept de confinement d'enfant, ici MainViewController est un contrôleur de vue parent et vous souhaitez ajouter une vue de contrôleur de vue enfant en tant que sous-vue sur le contrôleur de vue principal. 

Ajout et suppression d'un enfant

//call displayContentController to add SampleViewCOntroller view to mainViewcontroller
 [self displayContentController:sampleVCObject];

// write this method in MainViewController
- (void) displayContentController: (UIViewController*) content;
{
   [self addChildViewController:content];                 // 1
   content.view.bounds = testView.bounds;                 //2
   [testView addSubview:content.view];
   [content didMoveToParentViewController:self];          // 3
}

Voici ce que fait le code:

Elle appelle la méthode addChildViewController: du conteneur pour ajouter l’enfant. L'appel de la méthode addChildViewController: appelle également la méthode willMoveToParentViewController: de l'enfant automatiquement . Elle accède à la propriété de vue de l'enfant pour extraire la vue et l'ajoute à sa propre hiérarchie de vues. Le conteneur définit la taille et la position de l’enfant avant d’ajouter la vue; les conteneurs choisissent toujours l’emplacement du contenu de l’enfant. Bien que cet exemple opère explicitement en définissant le cadre, vous pouvez également utiliser des contraintes de présentation pour déterminer la position de la vue . Il appelle explicitement la méthode didMoveToParentViewController: de l’enfant pour signaler que l’opération est terminée.

//you can also write this method in MainViewController to remove the child VC you added before.
- (void) hideContentController: (UIViewController*) content
{
   [content willMoveToParentViewController:nil];  // 1
   [content.view removeFromSuperview];            // 2
   [content removeFromParentViewController];      // 3
}

Pour plus de détails, reportez-vous à la documentation Apple: https://developer.Apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html

Configuration d'un conteneur dans Interface Builder, pour ceux qui ne veulent pas écrire de code.

Pour créer une relation de conteneur parent-enfant au moment de la conception, ajoutez un objet de vue Conteneur à la scène de votre scénario, comme illustré dans la figure 5-3. Un objet de vue conteneur est un objet d'espace réservé qui représente le contenu d'un contrôleur de vue enfant. Utilisez cette vue pour dimensionner et positionner la vue racine de l’enfant par rapport aux autres vues du conteneur.

 Adding a container view in Interface Builder Lorsque vous chargez un contrôleur de vue avec une ou plusieurs vues de conteneur, Interface Builder charge également les contrôleurs de vue enfant associés à ces vues. Les enfants doivent être instanciés en même temps que le parent pour que les relations parent-enfant appropriées puissent être créées.

42
Sandeep Ahuja

Vous pouvez le faire simplement en utilisant StoryBoards

  • Ouvrez les story-boards et sélectionnez le contrôleur de vue dans lequel votre vue bleue est présente, ouvrez la recherche d'utilitaires pour ContainerView et faites-la glisser dans votre vue bleue. Ceci ajoutera automatiquement un contrôleur de vue servant de vue enfant à votre vue. Vous pouvez redimensionner votre vue conteneur dans l'inspecteur de taille.

enter image description here

13
raki

J'ai résolu le problème concernant uiview sur le deuxième contrôleur uiview . Suivez le code que j'ai utilisé:

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
SecondViewController *sb = (SecondViewController *)[storyboard instantiateViewControllerWithIdentifier:@"sb"];

sb.view.backgroundColor = [UIColor redColor];    
[sb willMoveToParentViewController:self];

[self.view addSubview:sb.view];

[self addChildViewController:sb];
[sb didMoveToParentViewController:self];

J'espère vous aider.

Merci beaucoup

6
user3576455

Vous pouvez ajouter un childViewController à UIViewController depuis iOS5 ... c'est un excellent moyen de créer des viewControllers plus petits et plus réutilisables, je les aime aussi beaucoup.

vous êtes vraiment proche, mais vous avez juste besoin de quelques lignes de code supplémentaires ..

///
 [self addChildViewController:sample];

 [self.testView addSubview:sample.view]; //you already have this..

 [sample didMoveToParentViewController:self]; 

Dans viewWillDisappear: ou l'une des autres méthodes de démontage dont vous aurez besoin pour nettoyer comme ceci:

//we'll need another pointer to sample, make it an iVar / property..
   [sample willMoveToParentViewController:nil];  // 1
   [sample removeFromSuperview];            // 2
   [sample removeFromParentViewController];      // 3

Vous pouvez lire la documentation Apple sur le contenu de viewControllers enfant ici https://developer.Apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerContainerViewControllers.html

3
Jef

J'essaie d'ajouter UIViewController dans la sous-vue et ce travail . Sur UIViewController, j'ai ajouté un bouton, dans le fichier .h:

-(IBAction)matchButtonAction:(id)sender;
-(IBAction)closeButtonAction:(id)sender;

Et dans le fichier .m:

-(IBAction)matchButtonAction:(id)sender
{
    NSLog(@"matchButtonAction");
}
-(IBAction)closeButtonAction:(id)sender
{
    NSLog(@"closeButtonAction");
}

mais je ne vois pas le journal. 

J'ai besoin d'ajouter le même paramètre sur UIViewController instantiateViewControllerWithIdentifier?

Comment résoudre le problème?

Mon initialisation UIViewController est:

AlertDialogViewController *alertDialogView = (AlertDialogViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"alertDialogView"];         
        [alertDialogView willMoveToParentViewController:self];
        [viewController.view addSubview:alertDialogView.view];
        [viewController addChildViewController:alertDialogView];
        [alertDialogView didMoveToParentViewController:viewController];
2
user3576455
SampleViewController * sample = [[SampleViewController alloc] initWithNibName:@"SampleViewController" bundle:nil];
sample.view.frame = CGRectMake(0, 0, self.testView.bounds.size.width, self.testView.bounds.size.height);

[self addChildViewController:sample];
[self.testView addSubview:sample.view];
2
Zigii Wong

Puisque votre contrôleur de vue est dans le storyboard, vous devez utiliser instantiateViewControllerWithIdentifier pour obtenir le VC à partir du storyboard.

SampleViewController * sample = [self.storyboard instantiateViewControllerWithIdentifier:@"IdOfSampleViewController"];
sample.view.frame = CGRectMake(0, 0, self.testView.bounds.size.width, self.testView.bounds.size.height);
[self.testView addSubview:sample.view];

N'oubliez pas l'ajout de l'identifiantpour la SampleViewController dans le storyboard

1
Anil Varghese

J'ai essayé d'utiliser ce code:

SecondViewController * secondViewController = [[SecondViewController alloc] initWithNibName: nil bundle: nil];

 secondViewController.view.frame = CGRectMake(0, 0, self.mySubView.bounds.size.width, self.mySubView.bounds.size.height);

 [self addChildViewController:secondViewController];
 [self.viewDialogSolution addSubview:secondViewController.view];

mais je ne vois que ma vue, pas la disposition de secondViewController.

Ho pour résoudre le problème?

Merci beaucoup

0
user3576455