清除Swift中的导航堆栈

时间:2015-08-25 20:54:22

标签: ios swift uinavigationcontroller

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

如果它去了 1)如果新用户启动漏斗 - > 2)漏斗屏1-5-> 3)漏斗完整屏幕

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

3 个答案:

答案 0 :(得分:6)

如果您只想清除导航堆栈,并在其上面推送新视图,则可以使用更简单的解决方案。

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

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

navController.didMoveToParentViewController( self )

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

推送其他控制器在堆栈顶部(您的渠道控制器),只需使用navController.pushViewController( yourControllerInstance!, animated: false )

如果您想在完成渠道后清除筹码,请致电:

navController.popToRootViewControllerAnimated( false )

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

答案 1 :(得分:3)

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

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)
            }
        }
    }

}

答案 2 :(得分:0)

我相信你可以通过简单地将一个新数组(在你的情况下只是仪表板视图)分配给UINavigationController的viewControllers属性来实现这一点。

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

相关问题