如何在转换 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 到当前的视图控制器时,您还必须将视图传回。
您应该将视图控制器的视图层次结构视为私有的。不这样做就违反了封装的原则。
假设在 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 到当前的视图控制器时,您还必须将视图传回。
您应该将视图控制器的视图层次结构视为私有的。不这样做就违反了封装的原则。