【问题标题】:Adding New viewcontroller to current stack将新视图控制器添加到当前堆栈
【发布时间】:2017-12-18 07:53:33
【问题描述】:

我正在将一个 ViewController 插入到我当前的堆栈中。并尝试像这样执行 popviewcontroller。

 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)

但是为什么我不能实现我想要做的事情。即使在满足我的视图控制器的第二个条件下,总是推送到根视图控制器。我想在我当前的视图控制器和根视图控制器之间添加一个新的视图控制器,并执行弹出操作。请帮我。 谢谢

【问题讨论】:

    标签: ios swift3 uinavigationcontroller popviewcontroller


    【解决方案1】:

    我认为您只是“错误计算”了数组位置。您的索引应该是:

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

    但是,这可能是一个更“健壮”的方法:

    @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)
    
                }
    
            }
    
        }
    
    }
    

    使用循环在堆栈中“查找”LoginViewController 允许您“弹出”它,即使它不是“行中的下一个”,也无需跟踪您的 dm.isLoginViewLoaded(除非您'正在其他地方使用)。

    【讨论】:

      【解决方案2】:

      试试这个代码:

      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)
            }
          } 
      

      【讨论】:

      • 我不想检查它是否存在。我知道它在没有登录视图控制器的情况下加载。所以我想手动插入并弹出它
      猜你喜欢
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多