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

kcs*_*cks 7 login ios swift

这里有新的iOS开发者.我正在开发一个项目,该项目要求用户在首次打开应用程序时登录.从那时起,我希望应用程序直接打开应用程序的主流程(在我的情况下是一个标签栏控制器).在做了一些研究之后,我发现了实现这个功能的两种主要方法:

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
    }
Run Code Online (Sandbox Code Playgroud)

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

    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)
    }
Run Code Online (Sandbox Code Playgroud)

如果我选择第二个选项,我可以在登录用户后轻松转换到应用程序的主流程(比如说标签栏控制器).在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)
Run Code Online (Sandbox Code Playgroud)

满容易.

至于第一种方法,我不确定如何在用户登录后转换到应用程序的主要内容.

我在这里寻找的是处理登录流程的"最佳"方式.我列出了两种方法,但也许还有另一种方法更好.另外,如果我列出的第一个"最佳"方法,在完成用户登录后如何进入我的标签栏控制器?谢谢!

Eri*_*ric 8

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

在这个容器视图控制器中,我可以根据用户的登录状态放置代码来显示和关闭登录视图控制器.注意:您还可以在此处使用临时全屏视图来隐藏应用程序的主要内容,同时显示/关闭登录屏幕 - 这是获得非常流畅的应用程序启动过渡的简单方法.

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

  • 我要做的是始终显示您的主导航控制器.在其`viewWillAppear`方法中,检查用户是否已登录.如果没有,请用某种品牌掩盖主要内容.如果是这样,我让用户进入应用程序.然后,在`viewDidAppear`中,如果用户未登录,则显示登录导航控制器(以模态方式).当登录序列完成并且登录导航控制器被解除时,主导航控制器的`viewWillAppear`和`viewDidAppear`方法再次被调用,他们将让用户进入应用程序或重新显示登录流程. (2认同)