没有调用添加到rootViewController的子视图的ViewDidAppear

时间:2018-04-14 10:43:03

标签: ios swift

我试图在屏幕上的所有元素的顶部显示一个子视图控制器(包括导航栏),我发现它的唯一方法是将它作为子视图控制器添加到我的窗口的rootViewController:

guard let window = UIApplication.shared.keyWindow,
        let view = window.rootViewController?.view
        else { return }
window.rootViewController?.addChildViewController(attachmentViewController)
view.addSubview(attachmentViewController.view)
attachmentViewController.view.snp.makeConstraints { make in
    make.left.equalTo(view)
    make.right.equalTo(view)
    make.top.equalTo(view)
    make.bottom.equalTo(view)
}
attachmentViewController.didMove(toParentViewController: window.rootViewController)

但是,这不会调用viewDidAppearviewWillDisappear方法......为什么会这样?我真的需要它。

2 个答案:

答案 0 :(得分:1)

而不是完成所有操作,只需present视图控制器(不要像建议的那样push)。

let destination = SomeViewController.instantiateFromStoryboard(self.storyboard!)
present(destination, animated: true, completion: nil)

答案 1 :(得分:0)

专注于“为什么会这样?”你的问题。

当您向视图调用addChildViewController时,您根本没有更改视图控制器的“堆栈”或主机视图控制器的状态;你只是将视图控制器添加为主视图的子控制器。

通常在使用子视图控制器时,您可以编排willMovedidMove等调用来触发视图控制器生命周期行为。

在你的情况下,推特或礼物可能会更好。 Present将为您提供覆盖视图控制器的功能。

作为一个注释,我使用了类似于您描述的用于管理登录/退出状态的方法,添加了已签名的子视图控制器或已注销的视图控制器。在这种情况下,当他们改变时我通常会调用以下方法:

// To add the child
addChildViewController(child)
view.addSubview(child.view)
child.didMove(toParentViewController: self)

// To remove the child.
child.willMove(toParentViewController: nil)
child.removeFromParentViewController()
child.view.removeFromSuperview()