我试图在屏幕上的所有元素的顶部显示一个子视图控制器(包括导航栏),我发现它的唯一方法是将它作为子视图控制器添加到我的窗口的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)
但是,这不会调用viewDidAppear
或viewWillDisappear
方法......为什么会这样?我真的需要它。
答案 0 :(得分:1)
而不是完成所有操作,只需present
视图控制器(不要像建议的那样push
)。
let destination = SomeViewController.instantiateFromStoryboard(self.storyboard!)
present(destination, animated: true, completion: nil)
答案 1 :(得分:0)
专注于“为什么会这样?”你的问题。
当您向视图调用addChildViewController
时,您根本没有更改视图控制器的“堆栈”或主机视图控制器的状态;你只是将视图控制器添加为主视图的子控制器。
通常在使用子视图控制器时,您可以编排willMove
和didMove
等调用来触发视图控制器生命周期行为。
在你的情况下,推特或礼物可能会更好。 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()