xcode storyboard容器视图 – 如何访问视图控制器

我试图使用故事板,让事情正常工作。 我已经添加了一个容器视图到我现有的一个视图。 当我尝试添加一个引用到我的视图控制器.h文件(Ctrl – 拖动),我得到一个IBOutlet UIView *containerView 。 我如何获得对容器视图的视图控制器的引用? 我需要容器视图控制器,所以我可以将它的委托设置到我的视图的控制器,以便他们可以相互“交谈”。

我有我的故事板设置为:

在这里输入图像说明

并在我的.h文件中引用它:

在这里输入图像说明

注意在.h这是一个UIView,而不是我的InstallViewController的视图。 如何添加对视图控制器的引用? 我需要能够设置其委托。

还有另一种解决scheme,通过指定embedded的segue(s)的标识符并在方法prepareForSegue:检索相应的视图控制器prepareForSegue:

这种方式的优点是,您不需要依赖添加子视图控制器的特定顺序,因为每个子视图控制器都是通过唯一的segue标识符embedded的。

更新2013-01-17 – 示例

 - (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_SegueIdEmbedMasterVCc_SegueIdEmbedDetailVC是具有在故事板中定义的segue ID的对应ID的常量。

当你添加一个容器视图时,xcode调用UIViewController方法addChildViewController:

在你的情况下,你可以得到容器ViewController在SplashViewController的childViewControllers列表中childViewControllers ,如下所示:

 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; } } 

我昨天也有同样的疑问:)

Vitor Franchi的答案是正确的,但可以更高效和方便。 尤其是访问子视图控制器多次。

创build一个只读属性

 @interface MyViewController () @property (nonatomic, weak, readonly) InstallViewController *cachedInstallViewController; @end 

然后创build一个方便的getter方法

 - (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; } 

从现在起以这种方式访问​​子视图控制器

 [self.installViewController doSomething]; 
 UIView* viewInsideOfContainer = installerView.subviews[0]; 

将给你你的控制器UIView引用的UIViewController里面的UIView。 您可以将子视图转换为从UIViewinheritance的任何types。

如果nib被加载,它会调用addChildViewController作为初始化过程的一部分

所以一个高性能的解决scheme也可以被覆盖

 - (void)addChildViewController:(UIViewController *)childController 

在那里你可以捕获你的childController,例如通过比较它的Class并将其分配给一个属性/ ivar

 -(void)addChildViewController:(UIViewController *)childController { [super addChildViewController:childController]; if([childController isKindOfClass:[InstallViewController class]]) { self.installViewController = (InstallViewController *)childController; } 

}

这将保存您从迭代通过childViewControllers。