我如何访问视图控制器

我试图使用故事板,让事情正常工作。 我已将一个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_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的答案是正确的,但可以更高效和方便。 特别是多次访问子视图控制器时。

创建一个只读属性

@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

上一篇: How do I access the viewcontroller

下一篇: UIPageViewController and storyboard