append UIViewController dans la sous-vue

Je ne sais pas si c'est la bonne key pour searchr "append UIViewController dans subview". Comme vous pouvez le voir dans mon image, il y a deux ViewController, le controller principal et le second. À l'intérieur du controller principal, il y a un UIView (couleur de fond bleue). A l'intérieur de UIView, je veux append le second ViewController dans mon UIView. J'ai ce code mais ça n'a pas marché.

entrez la description de l'image ici

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 initWithNibName: fonctionne dans le file xib, je ne suis pas le terme exact pour chercher dans google à ce sujet. J'essaie juste d'expérimenter quelque chose si c'est possible dans IOS. En espérant que vous comprenez ce que j'essaie de faire. En espérant pour 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, c'est à la search d'une plume. Je n'ai pas mis en place une plume ici.

Vous devez utiliser le concept de confinement des enfants, ici MainViewController est un controller de vue parent et vous voulez append une vue de controller de vue enfant comme une sous-vue sur le controller de vue principale.

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:

Il appelle la méthode addChildViewController du conteneur: pour append l'enfant. L'appel de la méthode addChildViewController: appelle également la méthode willMoveToParentViewController: de l'enfant automatiquement. Il accède à la propriété view de l'enfant pour récupérer 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'append la vue. les conteneurs choisissent toujours où le contenu de l'enfant apparaît. Bien que cet exemple le fasse en définissant explicitement le cadre, vous pouvez également utiliser les contraintes de disposition 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, veuillez vous référer au document 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 design, ajoutez un object de vue de conteneur à votre scène de storyboard, comme illustré à la Figure 5-3. Un object de vue conteneur est un object espace réservé qui représente le contenu d'un controller de vue enfant. Utilisez cette vue pour resize et positionner la vue racine de l'enfant par rapport aux autres vues du conteneur.

Ajout d'une vue de conteneur dans Interface Builder Lorsque vous chargez un controller de vue avec une ou plusieurs vues de conteneur, Interface Builder charge également les controllers de vue enfant associés à ces vues. Les enfants doivent être instanciés en même time que le parent afin que les relations parent-enfant appropriées puissent être créées.

Vous pouvez le faire simplement en utilisant StoryBoards

  • Ouvrez les storyboards et select le controller de vue dans lequel votre vue Blue est présente, ouvrez Utilities searchr ContainerView et faites-le glisser dans votre vue bleue, cela appenda automatiquement un controller de vue qui agit comme vue enfant pour votre vue. Vous pouvez resize votre vue de conteneur dans l'inspecteur de taille.

entrez la description de l'image ici

J'ai résolu le problème de l'uiview sur le second controller. 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 t'aider.

Merci beaucoup

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

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

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

Dans vous viewWillDisappear: ou l'une des autres methods de déassembly que vous aurez besoin de 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 les docs Apple sur contenant child controlController ici https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

Je suis en train d'append UIViewController dans subview, et ce travail. Sur UIViewController j'ai ajouté 2 button, dans le file .h:

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

Et dans le file .m:

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

mais je ne vois pas le journal.

Je dois append 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]; 
 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]; 

Puisque votre controller de vue est dans le storyboard, vous devez utiliser instantiateViewControllerWithIdentifier pour get le VC 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]; 

Ne pas oublier l'ajout de l' identifiant du SampleViewController dans le storyboard

J'ai essayé d'utiliser ce code:

SecondViewController * secondViewController = [[secondViewController alloc] initNithNibName: 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 vois seulement myview pas la disposition de secondViewController.

Ho pour résoudre le problème?

Merci beaucoup