基本上,我有3個視圖控制器,A,B和C.A和B都有一個後退按鈕,當用戶導航時彈出頂部視圖控制器離開堆棧向後。但是,一旦用戶將其設置爲C,沒有選擇向後退出,並且當發生這種情況時,如果不實際向後導航到A和B,我想將A和B從堆棧中彈出,因爲這會導致其他位置的後退按鈕出現問題應用程序,因爲堆棧上有剩餘的元素。你如何推薦這樣做?如何從堆棧中彈出視圖控制器而不導航到它們
我不想回到彈出的視圖控制器。
基本上,我有3個視圖控制器,A,B和C.A和B都有一個後退按鈕,當用戶導航時彈出頂部視圖控制器離開堆棧向後。但是,一旦用戶將其設置爲C,沒有選擇向後退出,並且當發生這種情況時,如果不實際向後導航到A和B,我想將A和B從堆棧中彈出,因爲這會導致其他位置的後退按鈕出現問題應用程序,因爲堆棧上有剩餘的元素。你如何推薦這樣做?如何從堆棧中彈出視圖控制器而不導航到它們
我不想回到彈出的視圖控制器。
您可以設置您的navigationController
的viewControllers
屬性,如果您想爲該轉換設置動畫,則也可以。
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。有時候取決於棧的當前狀態,這將彈出一個流行的動畫雖然
這沒有竅門。謝謝! –
不客氣:) – Magoo
你也可以設置你的視圖控制器'C'作爲你的rootViewController,所以無論你在'C'後面的任何地方點擊返回按鈕,它將全部下降到'C'。
添加到您的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()
}
}
您可以刪除導航堆棧一個& B,不含向後導航這樣的:
let controllersInStack = self.navigationController?.viewControllers
for viewController in controllersInStack!{
if(viewController.isKind(of: ViewControllerA) || viewController.isKind(of: ViewControllerB)){
viewController.removeFromParentViewController()
}
}
在你不希望這種情況下,你的ViewController C有導航欄,我正確嗎? – Aakash
[如何在swift中將視圖控制器彈出到以前的視圖控制器之一?](http://stackoverflow.com/questions/26343546/how-to-pop-view-controller-to-one-of-先前視圖控制器在迅速) – pableiros
@pableiros不想彈出到已經在堆棧上的視圖控制器,想'彈出'他們離開堆棧沒有導航 – Magoo