基本上,我有3个视图控制器,A,B和C.A和B都有一个后退按钮,当用户向后导航时,它会将顶视图控制器弹出堆栈。但是,一旦用户将其转到C,就没有选项可以倒退,我想在发生这种情况时将A和B从堆栈中弹出而不实际向后导航到A和B,因为这会导致其他地方的后退按钮出现问题应用程序,因为堆栈上有剩余的元素。你怎么建议这样做?
我不想尝试导航回弹出的视图控制器。
答案 0 :(得分:6)
您可以设置viewControllers
的{{1}}属性,如果您想要设置转换动画,也可以。
navigationController
navigationController?.viewControllers = []
在你的例子中,当你到达C时,你有
navigationController?.setViewControllers([], animated: true)
一旦你进入C就会从堆栈中删除A和B ..你可能必须把它放在navigationController?.viewControllers = [self]
中,但要确保你只做一次,除非你想让它冲洗堆栈每次C最终都出现在屏幕上。
viewDidAppear
或者当您即将推送到C时,您可以尝试代替var initialLoad:Bool = true
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
if initialLoad {
initialLoad = false
navigationController?.viewControllers = [self]
}
}
pushViewController
我相信会推动你前进,然后从堆栈中删除A和B.有时取决于堆栈的当前状态,即通过
动画弹出窗口答案 1 :(得分:0)
您还可以将视图控制器“C”设置为rootViewController,这样无论您在“C”之后的任何位置点击返回按钮,它都会降为“C”。
答案 2 :(得分:0)
将其添加到C视图控制器代码
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if let vc = self.storyboard?.instantiateViewController(withIdentifier: "vc") as? ViewController, self.navigationController?.viewControllers.count == 3, self.navigationController!.viewControllers[0].isKind(of: <#A_CLASS_OBJ#>), self.navigationController!.viewControllers[1].isKind(of: <#B_CLASS_OBJ#>) {
let navVC = UINavigationController(rootViewController: vc)
navVC.navigationBar.isHidden = true
navVC.automaticallyAdjustsScrollViewInsets = false
UIApplication.shared.delegate?.window??.rootViewController = navVC
UIApplication.shared.delegate?.window??.makeKeyAndVisible()
}
}
答案 3 :(得分:0)
您可以删除A&amp;来自导航堆栈的B没有向后导航,如下所示:
let controllersInStack = self.navigationController?.viewControllers
for viewController in controllersInStack!{
if( viewController.isKind(of: ViewControllerA) || viewController.isKind(of: ViewControllerB) ){
viewController.removeFromParentViewController()
}
}