addChildViewController 不适合 UIViewController
Posted
技术标签:
【中文标题】addChildViewController 不适合 UIViewController【英文标题】:addChildViewController don't fit UIViewController 【发布时间】:2015-07-11 20:16:38 【问题描述】:灵感来自Scott Sherwood tutorial 我在 UIViewController 中有一个 UIView,它通过自定义 segues 对不同的 UItableviewController/UIViewController 进行收费。
segue.m
- (void) perform
DashboardViewController *controller = (DashboardViewController *)self.sourceViewController;
UIViewController *dst = (UIViewController *) self.destinationViewController;
for(UIView *view in controller.container.subviews)
[view removeFromSuperview];
controller.currentViewController = dst;
[controller addChildViewController:dst];
[controller.container addSubview:dst.view];
第一个segue在viewDidLoad方法中被调用
controller.m
- (void)viewDidLoad
[super viewDidLoad];
[self performSegueWithIdentifier:@"dashboardNewPon" sender:[self.buttons.subviews objectAtIndex:0]];
屏幕以这种方式开始
其他segues,有这种行为
我不明白为什么,但它确实会自动布局。
谢谢
【问题讨论】:
【参考方案1】:通过阅读article,我找到了解决方案。
这一行之后
[controller.container addSubview:dst.view];
我添加了这个
dst.view.translatesAutoresizingMaskIntoConstraints = NO;
[controller.container addConstraint:[NSLayoutConstraint constraintWithItem:dst.view
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:controller.container
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:0.0]];
[controller.container addConstraint:[NSLayoutConstraint constraintWithItem:dst.view
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:controller.container
attribute:NSLayoutAttributeLeading
multiplier:1.0
constant:0.0]];
[controller.container addConstraint:[NSLayoutConstraint constraintWithItem:dst.view
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:controller.container
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:0.0]];
[controller.container addConstraint:[NSLayoutConstraint constraintWithItem:dst.view
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:controller.container
attribute:NSLayoutAttributeTrailing
multiplier:1.0
constant:0.0]];
【讨论】:
是的,您还需要约束。抱歉,我假设您已经在界面生成器中添加了它们。 但是如何在界面生成器中放入启动后将添加的约束?谢谢! 现在我看到您在 dst.view 和 container 之间添加了约束,而我正在谈论 container 和 controller.view 之间的约束。我不需要为添加的子视图添加约束,但如果你这样做,你提供的代码是正确的。 (无论如何,我更新了我的答案,因为我忽略了容器框架的起源。)【参考方案2】:我认为你应该添加这一行
CGRect dstFrame = CGRectMake (0, 0, controller.container.frame.size.width, controller.container.frame.size.height);
dst.view.frame = dstFrame;
之后
controller.currentViewController = dst;
并调用 viewWillAppear 中的第一个 segue:
【讨论】:
代码是一样的还是我错了? viewWillAppear 不会改变结果以上是关于addChildViewController 不适合 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章
iOS开发 关于addChildViewController的理解
addChildViewController与viewWillAppearviewDidAppear关系说明
addChildViewController与viewWillAppearviewDidAppear关系说明
addChildViewController与viewWillAppearviewDidAppear关系说明