2017-07-13 6 views
1

現在のスタックにViewControllerを挿入しています。このようなpopviewcontrollerを実行しようとしています。現在のスタックに新しいviewcontrollerを追加する

var viewControllersArray: [UIViewController] = self.navigationController!.viewControllers 


    if(dm.isLoginViewLoaded) 
    { 
     print("Login view already loaded") 

    } 

    else 
    { 
     print("Login view havent load before") 
     let myviewcontroller:LoginViewController=UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LOGIN") as! LoginViewController 
     let index=viewControllersArray.count-2 
     viewControllersArray.insert(myviewcontroller, at: index) 
     // update navigationController viewControllers 
     self.navigationController!.setViewControllers(viewControllersArray, animated:false) 

    } 
    self.navigationController?.popViewController(animated: true) 

しかし、なぜ私は何をしようとしています。私のviewcontrollerを満足するこの第2の条件でさえ、常にroot viewcontrollerを押す。私は現在のビューコントローラとルートビューコントローラの間に新しいviewcontrollerを追加し、pop操作を実行したいと思います。私を助けてください。 おかげ

答えて

0

は、このコードを試してみてください。

let arrController:[UIViewController] = (self.navigationController?.viewControllers)!//array of all controllers in navigation stack 
    for vc in arrController 
    { 
     if (type(of: vc) == type(of: LoginViewController 
))//check exist or not 
     { 
     self.navigationController?.popToViewController((arrController[(arrController.index(of: vc))!]), animated: true) 
     } 
    } 
+0

私はそれが存在するかどうかをチェックしたくありません..私はそれがloginviewcontrollerなしで読み込むことを知っています。だから私はそれを手動で挿入してポ – user1960169

0

私はあなたが単純に配列の位置「誤カウント」だと思います。あなたのインデックスは次のようになります。

let index = viewControllersArray.count - 1 // *not* -2 

しかし、これはもう少し「強固な」方法であってもよい:

スタック内の LoginViewControllerは、あなたが「それにポップすることを可能にする「見つける」ためにループを使用した
@IBAction func popToLogin(_ sender: Any) { 

    if let navVC = self.navigationController { 

     var bFoundLogin = false 

     var viewControllersArray = navVC.viewControllers 

     for vc in viewControllersArray.reversed() { 
      if vc is LoginViewController { 
       // we found LoginViewController in stack, so 
       // pop to it (even if it's multiple levels back) 
       bFoundLogin = true 
       navVC.popToViewController(vc, animated: true) 
       // found it, so break out of the for loop 
       break 
      } 
     } 

     if !bFoundLogin { 

      // we didn't find LoginViewController in stack, so 
      // replace current VC with LoginVC 

      //if let loginVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LOGIN") as? LoginViewController { 
      if let loginVC = UIStoryboard(name: "AnimConstraints", bundle: nil).instantiateViewController(withIdentifier: "LOGIN") as? LoginViewController { 

       // insert loginVC before last item 
       viewControllersArray.insert(loginVC, at: viewControllersArray.count - 1) 
       // set the NavVC's array of controllers 
       navVC.setViewControllers(viewControllersArray, animated: false) 
       // pop back one level (to our inserted loginVC) 
       navVC.popViewController(animated: true) 

      } 

     } 

    } 

} 

たとえそれが「次の行」ではなくても、あなたのdm.isLoginViewLoadedのトラッキングの必要性がなくなります(他の場所で使用している場合を除きます)。

関連する問題