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关系说明

使用 addChildViewController 时的 IBAction 不起作用

AddChildViewController