2016-12-05 8 views
0

私はiOS開発にかなり新しく、私はUINavigationControllerとA、B、Cと呼ぶ3つのViewControllerからなるアプリケーションを構築しています。segue中にUINavigationControllerのナビゲーションスタックからView Controllerを削除しますか?

最初にView Controller Aが表示されます。そこから、私は2つのワークフローがあります

  1. A> C

  2. A> B> C第ワークフローで

を、IはshouldPerformSegue(withIdentifierを定義しています)この方法の中で、私はビューコントローラCを表示するか、セグをキャンセルしてエラーメッセージを表示するかどうかを決定するために何らかの作業を行う必要があります。エラーが発生しなかったと仮定すると、コントローラCを見るためのセグが実行される。ビューコントローラCが表示されているとき、戻るボタンはビューコントローラBを指し示しますが、コントローラAを表示するように戻す必要があります。

私はちょうどセグエの続行を許可する場合はtrueを返す前にshouldPerformSegue(withIdentifier)の末尾に次のように呼び出すことにより、ナビゲーションスタックからビューコントローラBを削除しようとしました:

self.navigationController?.viewControllers.remove(at: index) 

私が読んでいる場合ドキュメントは正しく、ビューコントローラのインデックスは次のように対応を削除するには:

The root view controller is at index 0 
The back view controller is at index n-2 
The top view controller is at index n-1 

残念ながら、私は正常に動作するために、これを取得する任意の運を持っていませんでした。私は何か間違っていると確信していますが、他に何を試していいのか分かりません。誰かが私を正しい方向に向けることができますか?ありがとうございました!

+0

この記事をチェックアウトhttp://stackoverflow.com/questions/10822857/is-it-possible-to-pop-the -winavigationcontroller-を2回実行します。 – Adamsor

+0

これは人々が遭遇するかなり一般的な問題ですが、私の(限られた)知識の中で、組み込みの戻るボタンが何をするのかを簡単に変更する方法はありません。 UINavigationControllerをサブクラス化し、popメソッドを上書きして、トップビューコントローラがCであるかどうかを確認することもできます。Cであればアニメーションを1回ポップし、アニメーションをもう一度ポップします。それ以外の場合は一度ポップします。 – Erik

+0

'self.navigationController.popToRoot()'はあなたの問題を解決します –

答えて

2

あなたがこれを使用することができます。

var viewControllers = navigationController?.viewControllers 

viewControllers?.removeLast(2) //here 2 views to pop index numbers of views 

navigationController?.setViewControllers(viewControllers!, animated: true) 

あなたはあなたがカスタムバックボタンをを作成することができ、そのtouchUpInsideイベントに、あなたが特定のビューコントローラに開くことができます..また、このよう

0

を削除することができます。特定のビューコントローラにポップする

、あなたはこのコードを使用することができます:

your_navigationController?.popToViewController(YourViewControllerObject, animated: true) 
関連する問題