我如何访问视图控制器
我试图使用故事板,让事情正常工作。 我已将一个Container View添加到我现有的一个视图中。 当我尝试在我的视图控制器.h
文件(ctrl-drag)中添加对此的引用时,我得到一个IBOutlet UIView *containerView
。 我如何获得对容器视图的视图控制器的引用? 我需要容器视图控制器,这样我就可以将它委托给我的视图的控制器,以便他们可以相互“交谈”。
我有我的故事板设置为:
并在我的.h文件中引用它为:
注意在.h这是一个UIView,而不是我的InstallViewController的视图。 如何添加对视图控制器的引用? 我需要能够设置其委托。
还有另一种解决方案,通过指定embed segue(s)的标识符并在方法prepareForSegue:
检索相应的视图控制器prepareForSegue:
这种方式的优点是,由于每个子视图控制器都是通过一个唯一的segue标识符嵌入的,因此您不需要依赖添加子视图控制器的特定顺序。
更新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_SegueIdEmbedMasterVC
& c_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的答案是正确的,但可以更高效和方便。 特别是多次访问子视图控制器时。
创建一个只读属性
@interface MyViewController ()
@property (nonatomic, weak, readonly) InstallViewController *cachedInstallViewController;
@end
然后创建一个方便的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];
链接地址: http://www.djcxy.com/p/87705.html