xcode storyboard Container View - How do I access the viewcontroller
There is another solution by specifying an identifier for the embed segue(s) and retrieve the corresponding view controllers in method prepareForSegue:
The advantage of this way is that you needn't rely on a specific order in which your child view controllers are added due to the fact that each child view controller is embedded via an unique segue identifier.
Update 2013-01-17 - Example
- (void) prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender{ // -- Master View Controller if ([segue.identifier isEqualToString:c_SegueIdEmbedMasterVC]) { self.masterViewController = segue.destinationViewController; // ... } // -- Detail View Controller else if ([segue.identifier isEqualToString:c_SegueIdEmbedDetailVC]) { self.detailViewController = segue.destinationViewController; // ... }}
c_SegueIdEmbedMasterVC
& c_SegueIdEmbedDetailVC
are constants with the corresponding ID of the segue IDs defined in the storyboard.
When you add a container view the xcode calls the UIViewController method addChildViewController:
In your case, you can get the container ViewController looking for it on the SplashViewController's list of childViewControllers
, something like this:
for (UIViewController *childViewController in [self childViewControllers]){ if ([childViewController isKindOfClass:[InstallViewController class]]) { //found container view controller InstallViewController *installViewController = (InstallViewController *)childViewController; //do something with your container view viewcontroller break; }}
I had the same doubt yesterday :)
The answer of Vitor Franchi is correct but could be more performant and convenient. Especially when accessing the child view controller several times.
Create a readonly property
@interface MyViewController ()@property (nonatomic, weak, readonly) InstallViewController *cachedInstallViewController;@end
Then create a convenient getter method
- (InstallViewController *)installViewController{ if (_cachedInstallViewController) return _cachedInstallViewController; __block InstallViewController *blockInstallViewController = nil; NSArray *childViewControllers = self.childViewControllers; [childViewControllers enumerateObjectsUsingBlock:^(id childViewController, NSUInteger idx, BOOL *stop) { if ([childViewController isMemberOfClass:InstallViewController.class]) { blockInstallViewController = childViewController; *stop = YES; } }]; _cachedInstallViewController = blockInstallViewController; return _cachedInstallViewController;}
From now on access the child view controller that way
[self.installViewController doSomething];