Ios 如何使用Swift语言弹出VC跳过前两个视图控制器?

Ios 如何使用Swift语言弹出VC跳过前两个视图控制器?,ios,swift,Ios,Swift,我有4个视图控制器:欢迎、注册、登录、忘记密码。欢迎询问用户是否有帐户。如果是,则用户应单击“登录”按钮,否则用户应单击“注册”按钮 若用户按下注册按钮,应用程序将推到注册视图控制器,用户将填写表单并点击注册按钮。点击那个注册按钮应该会显示登录VC。但取而代之的是,它回到了受欢迎的主要风险投资领域 //This is the SignUp Action Btn @IBAction func actSingUp(_ sender: Any) { let storyboard = UI

我有4个视图控制器:欢迎、注册、登录、忘记密码。欢迎询问用户是否有帐户。如果是,则用户应单击“登录”按钮,否则用户应单击“注册”按钮

若用户按下注册按钮,应用程序将推到注册视图控制器,用户将填写表单并点击注册按钮。点击那个注册按钮应该会显示登录VC。但取而代之的是,它回到了受欢迎的主要风险投资领域

//This is the SignUp Action Btn 

@IBAction func actSingUp(_ sender: Any) {

    let storyboard = UIStoryboard(name: "LoginSB", bundle: nil)
    let signupvc = storyboard.instantiateViewController(withIdentifier: "loginVC") as! LoginVC
    navigationController?.popViewController(animated: true)

}

如果需要弹出2个视图

let vcs = self.navigationController!.viewControllers
let last2VC = vcs[vcs.count - 3] // if count = 4 then it will go to vc num 2 with index 1
self.navigationController?.popToViewController(last2VC,animated:true)


你的代码没有任何意义。您创建了一个新的“loginVC”,然后忽略它并执行一个pop


如果要将新的视图控制器推送到导航堆栈上,请使用推送,而不是pop。(
pushViewController(\uu:animated:)

您是popping(返回到以前的控制器),而不是pushing(添加新的)视图控制器。你应该做的是:

@IBAction func actSingUp(_ sender: Any) {

   let storyboard = UIStoryboard(name: "LoginSB", bundle: nil)
   let signupvc = storyboard.instantiateViewController(withIdentifier: "loginVC") as! LoginVC

   // this step is optional, it will remove SignUp controller from navigation stack
   navigationController?.popViewController(animated: false)

   // present login controller
   navigationController?.pushViewController(signupvc, animated: true)   
}

糟糕的主意。。。为什么你认为通过索引访问是个好主意???更糟糕的是,里面有硬编码的3。如果你的设计改变了怎么办?“如果前面有别的东西呢?”基里尔斯说。如果你假设这也会改变答案,op说堆栈中有4个vcs,没有办法crash@Sh_Khan问题中没有提到堆栈上有4个VCs。事实上,它说的恰恰相反:“如果用户按下注册按钮(来自欢迎),应用程序将推到注册视图控制器”可能有助于操纵导航堆栈。
guard let loginVC = navigationController?.viewControllers.first(where: { $0 is LoginVC}) as? LoginVC else { return }

navigationController?.popToViewController(loginVC, animated: true)
@IBAction func actSingUp(_ sender: Any) {

   let storyboard = UIStoryboard(name: "LoginSB", bundle: nil)
   let signupvc = storyboard.instantiateViewController(withIdentifier: "loginVC") as! LoginVC

   // this step is optional, it will remove SignUp controller from navigation stack
   navigationController?.popViewController(animated: false)

   // present login controller
   navigationController?.pushViewController(signupvc, animated: true)   
}