如何在转换UIViewController之间共享UIView(使用addChildUsingController :)

时间:2016-11-29 18:04:15

标签: ios objective-c uiviewcontroller parent-child childviewcontroller

让我们说,在转换到UIButton之前,ViewControllerA ViewControllerB发生了以下情况:

- (IBAction)levelSelectButton:(id)sender {
    ViewControllerB* obj = [[ViewControllerB alloc] init];
    [self addChildViewController:obj];
    CGSize screenSize = [MainScreen screen];
    CGFloat screenWidth = screenSize.width;
    CGFloat screenHeight = screenSize.height;
    obj.view.frame = CGRectMake(0,0,screenWidth,screenHeight);
    [obj.view addSubview:_banner];

    //[obj didMoveToParentViewController:self];
    [self runPushAnimationWithController:obj];
}

ViewControllerB显示时,我可以看到我的_bannerGADBannerView对象)视图,但当我返回ViewControllerA时,它已不再存在。

我之前从未使用过addChildViewController: / didMoveToParentViewController:方法,因此我不知道这是否是预期的,但我希望能够ViewControllerA返回_banner 1}}仍然可见。

我需要保留吗?

1 个答案:

答案 0 :(得分:0)

视图只能属于单个超级视图。引用Apple的文档:

  

视图只能有一个超级视图。如果视图已经有超视图和   该视图不是接收者,此方法删除了以前的   在使接收器成为新的超级视图之前的超视图。

因此,当您将视图添加到新创建的父视图控制器时,它将从当前视图控制器的视图层次结构中删除。

我建议不要这样做。只需在两个位置创建视图的副本。如果它使用大量数据,则在视图控制器之间共享数据(模型),而不是视图对象。

如果完全设置在视图控制器之间移动视图,我会向新视图控制器添加属性并设置该属性,而不是操纵其他视图控制器的视图层次结构。当您返回当前视图控制器时,您还必须传递视图BACK。

您应该将视图控制器的视图层次结构视为私有。不这样做违反了封装原则。