如何从堆栈中弹出视图控制器而不导航到它们
Posted
技术标签:
【中文标题】如何从堆栈中弹出视图控制器而不导航到它们【英文标题】:How to pop view controllers from the stack without navigating to them 【发布时间】:2016-12-08 14:35:01 【问题描述】:基本上,我有 3 个视图控制器,A、B 和 C。A 和 B 都有一个后退按钮,当用户向后导航时,它会将顶部视图控制器从堆栈中弹出。但是,一旦用户进入 C 并且我想在发生这种情况时将 A 和 B 从堆栈中弹出,而实际上没有向后导航到 A 和 B,则没有选项可以向后退,因为这会导致其他地方的后退按钮出现问题应用程序,因为堆栈上有剩余元素。您如何建议这样做?
我不想导航回弹出的视图控制器。
【问题讨论】:
在这种情况下,您不希望您的 ViewController C 有导航栏,对吗? How to pop view controller to one of the previous view controllers in swift?的可能重复 @pableiros 不想弹出到已经在堆栈中的视图控制器,想要在不导航的情况下将它们从堆栈中“弹出” 【参考方案1】:您可以设置navigationController
的viewControllers
属性,如果您想为该过渡设置动画,也可以。
navigationController?.viewControllers = []
navigationController?.setViewControllers([], animated: true)
在您的示例中,当您到达 C 时,您将拥有
navigationController?.viewControllers = [self]
一旦你到达 C.. 就会从堆栈中移除 A 和 B 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]
或者,当您即将推送到 C 时,您可以尝试而不是 pushViewController
let cViewController = CViewController()
navigationController?.setViewControllers([cViewController], animated: true)
我相信这会推动你前进,然后从堆栈中删除 A 和 B。有时取决于堆栈的当前状态,虽然会为弹出设置动画
【讨论】:
【参考方案2】:您还可以将您的视图控制器“C”设置为您的 rootViewController,这样无论您在“C”之后的任何位置点击返回按钮,它都会落入“C”。
【讨论】:
【参考方案3】:将此添加到您的 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()
【讨论】:
【参考方案4】:您可以从导航堆栈中删除 A 和 B,而无需像这样向后导航:
let controllersInStack = self.navigationController?.viewControllers
for viewController in controllersInStack!
if( viewController.isKind(of: ViewControllerA) || viewController.isKind(of: ViewControllerB) )
viewController.removeFromParentViewController()
【讨论】:
以上是关于如何从堆栈中弹出视图控制器而不导航到它们的主要内容,如果未能解决你的问题,请参考以下文章