在 Swift 中清除导航堆栈

Posted

技术标签:

【中文标题】在 Swift 中清除导航堆栈【英文标题】:Clearing Navigation Stack in Swift 【发布时间】:2015-08-25 20:54:21 【问题描述】:

我目前正在设计一个具有漏斗流和仪表板流的应用程序。我希望在完成时从内存中清除漏斗流:

所以如果它成功了 1) 如果新用户启动漏斗 -> 2) 漏斗屏幕 1-5 -> 3) 漏斗完成屏幕

我想转换到尚未在堆栈中的仪表板屏幕(在这种情况下它不是我的头控制器)。当我转换到仪表板时,如何从内存中清除上面的 6 个屏幕 - 基本上设置一个新的导航根并清除其余部分? unwind segue 似乎无法设置新的根目标。

【问题讨论】:

【参考方案1】:

如果您只想清除导航堆栈,并在其上推送一个新视图,还有一个更简单的解决方案。

假设您已经(以编程方式)分配了一个导航控制器,例如在viewDidLoad() 函数中,例如:

let navController = UINavigationController( rootViewController: YourRootController )
view.addSubview( navController.view )
addChildViewController( navController )

navController.didMoveToParentViewController( self )

YourRootController 充当堆栈的根(堆栈的底部)。

将其他控制器推到堆栈顶部(您的漏斗控制器),只需使用navController.pushViewController( yourControllerInstance!, animated: false )

如果您想在漏斗完成后清空堆栈,只需调用:

navController.popToRootViewControllerAnimated( false )

此函数会从您的堆栈中删除所有视图(根控制器除外)。

【讨论】:

navController.popToRootViewController(animated: false)解决了【参考方案2】:

所以我最终不得不以编程方式执行此操作,方法是弹回第一个控制器,然后从漏斗头替换为仪表板头:

func bookingCompleteAcknowledged()
    //remove the popup controller
    dismissViewControllerAnimated(true, completion: nil)
    //remove current controller
    dismissViewControllerAnimated(true, completion: nil)

    if let topController = UIApplication.sharedApplication().keyWindow?.rootViewController 

        if let navcontroller = topController.childViewControllers[0] as? UINavigationController
          navcontroller.popToRootViewControllerAnimated(false)

            if let funnelcontroller = navcontroller.childViewControllers[0] as? FunnelController 
                funnelcontroller.removeFromParentViewController();
                funnelcontroller.view.removeFromSuperview();

                let revealController = self.storyboard?.instantiateViewControllerWithIdentifier("DashboardController") as! SWRevealViewController

                navcontroller.addChildViewController(revealController)
                navcontroller.view.addSubview(revealController.view)
            
        
    


【讨论】:

【参考方案3】:

我相信您只需将一个新数组(在您的情况下仅包含仪表板视图)分配给 UINavigationController 的 viewControllers 属性即可做到这一点。

为什么要使用相同的导航控制器而不是制作一个新的?通常,我建议不要尝试更改导航控制器的根,而是创建一个新的导航控制器。

【讨论】:

嗨,Rschmidt,感谢您提出您的想法。这可能是我对导航控制器的缺乏经验,但过渡到新的导航控制器仍然会使用显示转场,将先前存在的屏幕留在内存中,不是吗? Tbh 我不知道,因为我不使用情节提要。我确信有办法将它从记忆中删除,否则这将是情节提要中的一个非常大的缺陷。

以上是关于在 Swift 中清除导航堆栈的主要内容,如果未能解决你的问题,请参考以下文章

如何清除导航堆栈?

清除返回堆栈导航 Windows 10

如何清除导航堆栈以使后退按钮不出现?

Ionic 4 Angular 路由器导航并清除上一页的堆栈/历史记录

如何从导航堆栈中删除 ViewController 并且没有返回到它的选项-Swift

swift 从导航堆栈中获取以前的视图控制器