在iOS应用程序启动时有条件地切换根视图控制器的最佳方式

新的iOS开发者在这里。 我正在开发一个项目,要求用户在第一次打开应用程序时login。 从那时起,我希望应用程序直接打开应用程序的主stream程(在我的情况下是一个标签栏控制器)。 在做了一些研究之后,我遇到了似乎有两个主要的方法来实现这个function:

1)有条件地在应用程序委托中设置应用程序窗口的根视图控制器。 例如:

if userLoggedIn { let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) let tabBarController: UITabBarController = storyboard.instantiateViewControllerWithIdentifier("TabBarController") as! UITabBarController self.window?.makeKeyAndVisible() self.window?.rootViewController = tabBarController } else { let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) let logInViewController: LogInViewController = storyboard.instantiateViewControllerWithIdentifier("LogInViewController") as! LogInViewController self.window?.makeKeyAndVisible() self.window?.rootViewController = logInViewController } 

2)使用导航控制器作为应用程序的根视图控制器,并有条件地将由导航控制器pipe理的视图控制器设置在应用程序委托中。 例如:

  if userLoggedIn { let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) let tabBarController: UITabBarController = storyboard.instantiateViewControllerWithIdentifier("TabBarController") as! UITabBarController let navigationController = self.window?.rootViewController as! UINavigationController navigationController.navigationBarHidden = true navigationController.setViewControllers([tabBarController], animated: true) } else { let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) let tabBarController: ViewController = storyboard.instantiateViewControllerWithIdentifier("LoginViewController") as! ViewController let navigationController = self.window?.rootViewController as! UINavigationController navigationController.navigationBarHidden = true navigationController.setViewControllers([tabBarController], animated: true) } 

如果我使用第二个选项,在完成login之后,我可以轻松地转换到应用程序的主要stream程(让我们说一个标签栏控制器)。 在LogInViewController的适当位置,我可以说:

  // Transition to tab bar controller let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) let tabBarController: UITabBarController = storyboard.instantiateViewControllerWithIdentifier("TabBarController") as! UITabBarController self.navigationController?.setViewControllers([tabBarController], animated: true) 

挺容易。

至于第一种方法,我不知道如何在login用户后转换到应用程序的主要内容。

我在这里寻找的是处理loginstream程的“最佳”方式。 我列出了两种方法,但也许还有另一种更好。 另外,如果“最佳”方法是我列出的第一个,那么在完成login用户之后,如何才能到达标签栏控制器? 谢谢!

这些都是很好的select。 有一件事我已经做得很好,实现了一个自定义容器视图控制器作为我的应用程序的根(这可能是我的主视图控制器的一个子类,如标签栏控制器或导航控制器)。

在这个容器视图控制器中,我可以根据用户的login状态将代码显示和解除一个login视图控制器。 注意:您也可以在这里使用临时的全屏视图隐藏您的应用程序的主要内容,而login屏幕显示/解散 – 这是一个简单的方法来获得非常stream畅的应用程序启动过渡。

我特别喜欢这种方法,因为应用程序的其余部分不需要担心细节。 你的容器可以像一个普通的标签栏控制器或导航控制器,但在下面,你可以将所有的loginUI逻辑封装在一个地方。