2017-04-21 24 views
2

私のアプリでは、3つのテーブルビューコントローラと、潜在的に多くのUIViewControllersがあります。ユーザーがいずれかの時点で戻ると最初のテーブルビューコントローラに戻る必要があります。私はユーザーが潜在的に何百ものページを逆戻りしなければならないとは思わない。これは、私は、ユーザーが[戻る]ボタンを押すと、それは私が検索しましたし、ソリューションのどれもこれまで働いていないメッセージがスウィフト3:popToViewControllerが動作しない

override func viewWillDisappear(_ animated: Bool) { 
    if !movingForward { 
     print("moving back") 
     let startvc = self.storyboard!.instantiateViewController(withIdentifier: "FirstTableViewController") 
     _ = self.navigationController!.popToViewController(startvc, animated: true) 
    } 
} 

を印刷されて動作するかどうかを決定するために楽しまものです。

答えて

9

popToViewControllerあなたは、ナビゲーションスタックにあるものの代わりにFirstTableViewControllerの完全な新しい参照を渡しています。だから、navigationController?.viewControllersをループしてFirstTableViewControllerを見つけて、FirstTableViewControllerのインスタンスでpopToViewControllerと呼ぶ必要があります。

あなたが まず画面に移動したい場合、あなたはおそらく popToRootViewController代わりの popToViewControllerを探して
for vc in (self.navigationController?.viewControllers ?? []) { 
    if vc is FirstTableViewController { 
     _ = self.navigationController?.popToViewController(vc, animated: true) 
     break 
    } 
} 

_ = self.navigationController?.popToRootViewController(animated: true) 
+0

おお、それを知りませんでした。できます!しかし、少し遅延があります。それは最初に以前のビューをロードして、それから私が望むものにジャンプします。これを修正する方法はありますか? – Filipe

+0

@Filipe '' viewWillDisappear'の中で呼び出すので、 '' false''にアニメーションを設定します。 –

+0

@Filipeこのコードを 'viewWillDisappear'の中に入れて、これをleftBarButtonItemとしてカスタムバックバーボタンを設定する必要があるので、そのメソッドの動作でこのコードを追加 –

1

これを試してみてください:

let allViewController: [UIViewController] = self.navigationController!.viewControllers as [UIViewController]; 

         for aviewcontroller : UIViewController in allViewController 
         { 
          if aviewcontroller .isKindOfClass(YourDestinationViewControllerName)// change with your class 
          { 
          self.navigationController?.popToViewController(aviewcontroller, animated: true) 
          } 
         } 
+0

同様に動作しますが、私は他のソリューションと同じ問題に遭遇しています。これは、前のビューが希望のものに行く前にまだ表示されているということです。すべての修正? – Filipe

+0

どの前のビュー? – KKRocks

関連する問題