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

7

我是一名新的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
    }

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

如果我选择第二个选项,在用户登录完成后,我可以轻松地切换到应用程序的主要流程(比如说一个选项卡控制器)。在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)

非常简单。

关于第一种方法,我不确定在登录用户后如何过渡到应用程序的主要内容。

这里我正在寻找处理登录流程的“最佳”方式。我列出了两种方法,但也许有其他更好的方法。此外,如果“最佳”方法是我列出的第一种方法,那么在完成用户登录后,我如何进入选项卡栏控制器?谢谢!

1个回答

8
那两种方法都不错。我曾经做过一件事,效果不错,那就是将自定义容器视图控制器作为应用程序的根视图控制器(这可能是我的主视图控制器的子类,如选项卡控制器或导航控制器)。
在这个容器视图控制器中,我可以放置代码来显示和关闭登录视图控制器,基于用户的登录状态。注意:您也可以在此处使用临时全屏视图来隐藏应用程序的主要内容,而同时显示/关闭登录屏幕 - 这是实现非常流畅的应用程序启动转换的简单方法。
我特别喜欢这种方法,因为应用程序的其余部分无需担心细节。您的容器可以像普通的选项卡控制器或导航控制器一样工作,但在底层,您可以将所有登录UI逻辑封装在一个地方。

谢谢Eric。我对使用容器视图控制器的经验不是很丰富,但这听起来像一个非常吸引人的选择,也许比我提到的其他选项更加清晰。我会更深入地了解容器视图控制器,并尝试组合其中之一。 - kcstricks
就像我所说的,如果你的应用程序的主视图控制器是一个标签栏控制器,我会建立一个 UITabBarController 的子类并把所有逻辑放在里面。如果需要进一步帮助,请告诉我! - Eric
嗨,Eric。我正在开发一个新项目,其中有一个导航控制器来处理一系列登录屏幕,用户在其中输入他们的信息,另一个导航控制器用于应用程序的主要内容。我正在努力设置这个,以便登录导航控制器运行第一次启动,而主导航控制器是用户在随后的启动中看到的全部内容。您能否提供一些指导,告诉我如何使用您的“容器”视图控制器方法来设置这个?如果您有时间,代码片段将非常有帮助!谢谢! - kcstricks
另外一点需要注意的是:我尝试了原帖中的第二种方法,但这里不起作用,因为您不能将一个导航控制器设置为由另一个导航控制器管理的视图控制器,所以我希望您的方法能够解决问题。 - kcstricks
2
我会一直显示主导航控制器。在其viewWillAppear方法中,检查用户是否已登录。如果没有,则用某种品牌覆盖主要内容。如果是,则让用户进入应用程序。然后,在viewDidAppear中,如果用户未登录,则以模态方式呈现登录导航控制器。当登录序列完成并且登录导航控制器被解除时,主导航控制器的viewWillAppearviewDidAppear方法将再次被调用,并且它们将让用户进入应用程序或重新显示登录流程。 - Eric
刚刚把这个东西搞定了,正是我所需要的!谢谢! - kcstricks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接