在 Swift 中清除导航堆栈
Clearing Navigation Stack in Swift
我目前正在设计一个具有漏斗流和仪表板流的应用程序。我希望漏斗流在完成时从内存中清除:
所以如果它去
1) 如果新用户启动漏斗 -> 2) 漏斗屏幕 1-5 -> 3) 漏斗完成屏幕
我想转换到尚未在堆栈上的仪表板屏幕(在这种情况下它不是我的主控制器)。当我转换到仪表板时,如何从内存中清除上面的 6 个屏幕——基本上是设置一个新的导航根并清除其余屏幕?展开转场似乎无法设置新的根目的地。
我相信您可以通过简单地向 UINavigationController 的 viewControllers 分配一个新数组(在您的情况下只有仪表板视图)来做到这一点 属性.
为什么要使用相同的导航控制器而不是制作一个新的?通常,与其尝试更改导航控制器的根,我建议只创建一个新的导航控制器。
所以我最终不得不通过弹出回到第一个控制器然后从漏斗头替换为仪表板头以编程方式完成它:
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)
}
}
}
}
如果您只想清除导航堆栈,并在其上推送一个新视图,还有一个更简单的解决方案。
假设您已经(以编程方式)分配了一个导航控制器,例如在 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) 如果新用户启动漏斗 -> 2) 漏斗屏幕 1-5 -> 3) 漏斗完成屏幕
我想转换到尚未在堆栈上的仪表板屏幕(在这种情况下它不是我的主控制器)。当我转换到仪表板时,如何从内存中清除上面的 6 个屏幕——基本上是设置一个新的导航根并清除其余屏幕?展开转场似乎无法设置新的根目的地。
我相信您可以通过简单地向 UINavigationController 的 viewControllers 分配一个新数组(在您的情况下只有仪表板视图)来做到这一点 属性.
为什么要使用相同的导航控制器而不是制作一个新的?通常,与其尝试更改导航控制器的根,我建议只创建一个新的导航控制器。
所以我最终不得不通过弹出回到第一个控制器然后从漏斗头替换为仪表板头以编程方式完成它:
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)
}
}
}
}
如果您只想清除导航堆栈,并在其上推送一个新视图,还有一个更简单的解决方案。
假设您已经(以编程方式)分配了一个导航控制器,例如在 viewDidLoad()
函数中,例如:
let navController = UINavigationController( rootViewController: YourRootController )
view.addSubview( navController.view )
addChildViewController( navController )
navController.didMoveToParentViewController( self )
YourRootController
作为堆栈的根(堆栈的底部)。
要将其他控制器推到堆栈顶部(您的漏斗控制器),只需使用navController.pushViewController( yourControllerInstance!, animated: false )
。
如果你想在漏斗完成后清除堆栈,只需调用:
navController.popToRootViewControllerAnimated( false )
此函数从您的堆栈中删除所有视图(根控制器除外)。