如何从第3个ViewController弹出到没有NavigationControllers的初始ViewController?

时间:2016-10-10 06:32:00

标签: ios swift cocoa-touch

我知道这可能是一件容易的事,但我无法理解如何解决它。顺便提一下,我没有使用NavigationController。基本上我的应用程序中有3个视图控制器:

  • - LoginVC(这有一个注册按钮。点击时会转到SignupVC)
  • - SignupVC(如果用户注册,则会推送到MainAppVC)
  • - MainAppVC(有一个退出按钮)

对于过渡,我使用方法:present(viewController, animated:, completion:)

当用户通过LoginVC登录时,他将按预期显示MainAppVC。当他退出时,我dismiss当前的VC(即MainAppVC)将他发送回LoginVC

现在我遇到问题。当用户没有帐户并注册时,这将是他将通过的VC(LoginVC> SignupVC> MainAppVC)。一旦他成功注册,他就会被提交给MainAppVC。现在,一旦他退出,他就会从MainAppVC转换到SignupVC,因为我使用了相同的dismiss方法。

我想要做的是将用户从MainAppVC发送回LoginVC。如何在我的项目中不使用导航控制器的情况下实现这一目标?流行的应用程序(Facebook,Twitter,Instagram等)如何在他们的应用程序中处理这个问题?

我能想到的一种方法是执行从第3个到第1个VC的segue,但我认为这是一种肮脏的方式,因为它只是添加到堆栈,而不是将其弹出,这是一个潜在的问题。

4 个答案:

答案 0 :(得分:2)

有三种解决方案 1.使用窗口根视图控制器。在登录和主视图控制器之间设置根视图控制器。

let loginSb = UIStoryboard(name: "Login", bundle: nil)
let loginVc = loginSb.instantiateInitialViewController()
window!.rootViewController = loginVc

2.首次显示主视图控制器时,请关闭注册视图控制器。并从登录视图控制器显示主视图控制器。
3.当您关闭主视图控制器时,尝试关闭完成块中的注册视图控制器 我认为第一个是最好的。

答案 1 :(得分:2)

如果被迫不使用rootViewControllerUINavigationController),你应该检查MainAppVC哪一个是前一个VC(示例中为伪代码)并执行:

注意:Swift 3 Code。

// If previous VC is LoginVC
dismiss(animated: true)

// else if previous VC is SignupVC
// here's what you want
presentingViewController?.presentingViewController?.dismiss(animated: true)

希望有所帮助。

答案 2 :(得分:1)

另一个选择是使用展开segues。

在要返回的ViewController中,按如下方式实现方法

@IBAction func unwindToLogin(segue: UIStoryboardSegue) {
}

然后在Storyboard中,从最后一个ViewController右键单击并从按钮(例如)拖动到Exit并选择unwindToLoginWithSegue。

enter image description here

请注意,您也可以以编程方式执行此操作。 Here是一个很好的教程。

答案 3 :(得分:1)

最佳方法是: 用户注册成功后解除SignUpVC,然后从LoginVC出现MainVC。

在SignupVC中:

self.dismissViewControllerAnimated(true, completion: {
                self.LoginVC!.present(MainVC, animated: true, completion:nil)

    })

这种方法主要用于。