我有第一个带有导航栏的视图控制器。接下来,我转到带有导航栏的第二个视图控制器。接下来我想进入带有导航栏和
overCurrentContext
选项的第三视图控制器。在第三个视图控制器中,我希望后退按钮返回到第一个视图控制器。我使用这段代码来做到这一点:
在第二个VC中:
let detailViewController = ThirdVC()
self.navigationController?.modalPresentationStyle = .overFullScreen
self.navigationController?.pushViewController(detailViewController, animated: false)
在第三个 vc 中用于后退按钮:
self.navigationController?.popToRootViewController(animated: false)
但是我看不到第二个 vc 作为第三个 vc 的背景。
.overCurrentContext
不起作用。我看到灰色背景。怎么解决?
.overFullScreen 是一种 modalPresentationStyle,因此它仅在您以模态方式“呈现”视图时才起作用。所以它不适用于推送,它将 ViewController 推送到导航堆栈中。
在您的情况下,如果您确实想以模态方式呈现 ThirdVC,然后从 SecondVC 弹出到 rootViewController,因为 SecondVC 已被推送到导航堆栈。您可以通过使用委托模式通知第二个 VC 弹出以重新 rootVC 来实现这一点。
另一种方法是使用闭包,如下所示:
在你的thirdVC中,声明一个闭包:
var onPopToRoot:(()-> Void)
然后在你的 pop 函数中,例如:
@objc private func popToRoot() {
onPopToRoot?()
dismiss(animated: true)
}
在你的第二个VC中:
@objc private func goThird() {
let detailViewController = ThirdVC()
self.navigationController?.modalPresentationStyle = .overFullScreen
detailViewController.onPopToRoot = {[weak self] in
self?.navigationController?.popToRootViewController(animated: true)
}
self.present(detailViewController, animated: true, completion: nil)
}