2017-09-04 78 views
1

是否有可能更改UINavigationController的以前的视图控制器?导航回到另一个视图控制器,而不是从它出现

假设我有三个视图控制器(A,B,C)嵌入在UINavigationController中。点击A中的按钮按下B,然后点击B中的按钮将会按下C。现在,如果用户点击C的后退按钮,我想直接将用户重定向到A而不是B.

+0

第一显示您的代码询问问题。 –

+0

使用unwind segue阅读:https://stackoverflow.com/questions/44513291/retrieving-stack-of-viewcontrollers-when-segueing-programatically/44513322#44513322 –

+0

@ Gagan_iOS.There是没有必要的Code.it这么简单的问题并可以通过example.so解释为什么你需要检查代码? –

回答

1

您应该从C的viewDidAppear方法中删除导航控制器的viewControllers阵列中的B.

var didRemoveB = false 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    if !didRemoveB { 
     navigationController?.viewControllers.remove(atIndex: 1) //assuming B's index is 1 
     didRemoveB = true 
     } 
} 
+0

像魅力一样工作。谢谢回答。 –

1

当然,是 -

self.navigationController?.popToViewController(viewControllerA, animated: true) 

欲了解更多信息,请阅读documentation

查看this SO question了解如何将其与后退按钮组合使用。

+0

这也有效。要使用这一个,我需要将后退按钮更改为自定义后退按钮或更改后退按钮动作。因为如果用户交换返回它将显示第二个视图控制器。 –

2
let arrViewControllers: [Any]? = self.navigationController?.viewControllers 
    for controller: Any in arrViewControllers! { 
     if (controller is cVC) { 
      self.navigationController!.popToViewController(controller as! UIViewController, animated: true) 
     } 
    } 
0

有可能在许多方式, 首先,你可以处理的时候你的ViewController B是上消失,navigationController

viewControllers的变化栈
override func viewWillDisappear(animated : Bool) { 
    super.viewWillDisappear(animated) 

    if (self.isMovingFromParentViewController()){ 
     self.navigationController.viewControllers = viewControllers // your viewControllers stack 
    } 
} 

UPDATE

或流行以root身份:

self.navigationController.popToRootViewControllerAnimated() 

或弹出视图控制器,直到指定的视图控制器是在导航堆栈:顶部

self.navigationController.popToViewController(:animated:) 
相关问题