2016-12-08 62 views
2

基本上,我有3個視圖控制器,A,B和C.A和B都有一個後退按鈕,當用戶導航時彈出頂部視圖控制器離開堆棧向後。但是,一旦用戶將其設置爲C,沒有選擇向後退出,並且當發生這種情況時,如果不實際向後導航到A和B,我想將A和B從堆棧中彈出,因爲這會導致其他位置的後退按鈕出現問題應用程序,因爲堆棧上有剩餘的元素。你如何推薦這樣做?如何從堆棧中彈出視圖控制器而不導航到它們

我不想回到彈出的視圖控制器。

+0

在你不希望這種情況下,你的ViewController C有導航欄,我正確嗎? – Aakash

+0

[如何在swift中將視圖控制器彈出到以前的視圖控制器之一?](http://stackoverflow.com/questions/26343546/how-to-pop-view-controller-to-one-of-先前視圖控制器在迅速) – pableiros

+0

@pableiros不想彈出到已經在堆棧上的視圖控制器,想'彈出'他們離開堆棧沒有導航 – Magoo

回答

5

您可以設置您的navigationControllerviewControllers屬性,如果您想爲該轉換設置動畫,則也可以。

navigationController?.viewControllers = []

navigationController?.setViewControllers([], animated: true)

在您的例子,當你到C你必須

navigationController?.viewControllers = [self]

這會從堆棧中刪除A和B,一旦你已經有了到C ..你可能必須把它放在viewDidAppear,但確保你只做一次,除非你想要它在每次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。有時候取決於棧的當前狀態,這將彈出一個流行的動畫雖然

+0

這沒有竅門。謝謝! –

+0

不客氣:) – Magoo

0

你也可以設置你的視圖控制器'C'作爲你的rootViewController,所以無論你在'C'後面的任何地方點擊返回按鈕,它將全部下降到'C'。

0

添加到您的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() 
    } 
} 
0

您可以刪除導航堆棧一個& B,不含向後導航這樣的:

let controllersInStack = self.navigationController?.viewControllers 

for viewController in controllersInStack!{ 
    if(viewController.isKind(of: ViewControllerA) || viewController.isKind(of: ViewControllerB)){ 
     viewController.removeFromParentViewController() 
    } 
} 
相關問題