2016-12-08 6 views
2

基本的には、A、B、Cの3つのビューコントローラがあります。AとBの両方には、ユーザーがナビゲートするときにトップビューコントローラをポップするバックボタンがあります後方に。しかし、ユーザーがCにすると後ろに行くオプションはなく、実際にAとBに戻ることなく実際にAとBをスタックからポップしたいのですが、これはバックボタンの問題を引き起こしていますスタック上に残りの要素があるため、アプリケーションです。これをどうお勧めしますか?ビューコントローラをスタックからポップする方法

ポップされたView Controllerに戻るのを試みていません。

+0

をしたくないという場合は、あなたのViewController Cは、ナビゲーションバーを持って、私は正しいですか? – Aakash

+0

[ビューコントローラを以前のビューコントローラのどれかに迅速にポップする方法は?](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に到達するとき、あなたが持ってたらスタックからAとBを削除します

navigationController?.viewControllers = [self]

を持っていると思いますあなたはそれをviewDidAppearに入れなければならないかもしれませんが、Cが画面上に終わるたびにスタックをフラッシュしない限り、一度だけそれを行うようにしてください。

また、あなたが pushViewController

let cViewController = CViewController() 
navigationController?.setViewControllers([cViewController], animated: true) 

の代わりに試みることができると私は前方にあなたをプッシュして、スタックからAとBを削除します信じて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] 
    } 
} 

。時々、ポップをアニメーション化するスタックの現在の状態に応じて

+0

これはトリックでした。ありがとうございました! –

+0

あなたは大歓迎です:) – Magoo

0

また、あなたの「C」の後にどこからでも戻るボタンを押すかどうかにかかわらず、あなたのrootViewControllerとしてビューコントローラ 'C'を設定することもできます「C」に落ちる。

0

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を削除することができ、あなたのCビューコントローラコードにこれを追加します。

let controllersInStack = self.navigationController?.viewControllers 

for viewController in controllersInStack!{ 
    if(viewController.isKind(of: ViewControllerA) || viewController.isKind(of: ViewControllerB)){ 
     viewController.removeFromParentViewController() 
    } 
} 
関連する問題