Xcode的故事板容器视图 - 如何访问视图 - 控制(xcode storyboard Conta

2019-07-03 15:36发布

我试图用故事板和得到的东西正常工作。 我已经添加了AA集装箱查看到我现有的景色之一。 当我尝试添加在我的视图控制器这是一个参考.h文件(按住Ctrl键),我得到一个IBOutlet UIView *containerView 。 如何获取到容器视图的视图控制器的参考呢? 我需要的容器视图控制器,以便我可以将它的委托设置为我的观点的控制器,使他们能够“讲”给对方。

我有我的故事板设置为:

而它在我的.h文件作为参考:

在作为.H通知是一个UIView,不是我InstallViewController的视图。 如何添加到视图控制器的参考? 我需要可以设置其委托。

Answer 1:

有通过指定嵌入SEGUE(多个)的标识符的另一个解决方案和检索方法对应的视图控制器prepareForSegue:

这种方式的好处是,你不必依赖于您的孩子视图控制器是由于添加到每个子视图控制器通过一个唯一的标识符,赛格瑞嵌入一个事实,具体顺序。

更新2013年1月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常量。



Answer 2:

当您添加一个容器查看Xcode中调用的UIViewController方法addChildViewController:

你的情况,你可以得到容器的ViewController寻找它的SplashViewController的名单上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;
    }
}

昨天我有同样的疑问:)



Answer 3:

的回答维托尔·弗兰基是正确的,但可能是更好的性能和方便。 尤其是在访问子视图控制器几次时。

创建一个只读属性

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

然后创建一个方便的获取方法

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


Answer 4:

UIView* viewInsideOfContainer = installerView.subviews[0];

会给你的UIView的UIViewController中,你的控制器的UIView引用的内部。 你可以投子视图任何类型从UIView的继承。



Answer 5:

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

这样一个高性能的解决方案可能还覆盖

- (void)addChildViewController:(UIViewController *)childController

在那里,你可以通过比较其类赶上你childController例如,并将其分配给一个属性/伊娃

-(void)addChildViewController:(UIViewController *)childController
{
    [super addChildViewController:childController];

    if([childController isKindOfClass:[InstallViewController class]])
    {
        self.installViewController = (InstallViewController *)childController;
    }

}

这将节省您从迭代线槽childViewControllers。



文章来源: xcode storyboard Container View - How do I access the viewcontroller