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

How to share UIView between transitioning UIViewController's (with addChildUsingController:)

假设在 ViewControllerA 中点击 UIButton,在过渡到 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 出现时,我可以看到我的 _banner(一个 GADBannerView 对象)视图,但是当我 return 到 ViewControllerA它不再存在。

我以前从未使用过 addChildViewController:/didMoveToParentViewController: 方法,所以我不知道这是否符合预期,但我希望能够 return 到 ViewControllerA _banner 仍然可见。

我需要保留它吗?

一个视图只能属于一个父视图。引用 Apple 的文档:

Views can have only one superview. If view already has a superview and that view is not the receiver, this method removes the previous superview before making the receiver its new superview.

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

我建议不要做这种事情。只需在这两个地方创建视图的副本。如果它使用大量数据,请在视图控制器之间共享数据(模型),但不要共享视图对象。

如果您完全愿意在视图控制器之间移动视图,我会向新视图控制器添加一个 属性 并设置它 属性 而不是操纵其他视图控制器的视图层次结构.当您 return 到当前的视图控制器时,您还必须将视图传回。

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