在 UITabBarController 之前呈现登录视图控制器

Posted

技术标签:

【中文标题】在 UITabBarController 之前呈现登录视图控制器【英文标题】:Presenting Login View Controller Before the UITabBarController 【发布时间】:2018-03-04 02:34:53 【问题描述】:

我想提供一个登录视图控制器,以便我的用户可以在显示标签栏控制器之前进行身份验证。在下面显示的代码中,我收到错误“无法将 'LogInViewController' 类型的值转换为 'UITabBarController'。列出的 Apple 文档:

部署标签栏界面时,必须将此视图安装为 你的窗口的根。与其他视图控制器不同,标签栏 界面永远不应该作为另一个视图的子项安装 控制器。

当我在作为选项卡栏控制器一部分的 5 个视图控制器(例如,controller1.coreDataStack = coreDataStack,声明为 AppDelegate 类中的属性)传播核心数据时,我感到很困惑,而且我的实现很复杂。我可以就如何将用户从登录屏幕转换到选项卡式视图控制器之一获得一些帮助吗?任何意见将不胜感激。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 

    // Login View Controller
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let loginVC = storyboard.instantiateViewController(withIdentifier: "loginVC") as! LogInViewController
    self.window?.rootViewController = loginVC

    // TabBar Controller
    let tabController = window!.rootViewController as! UITabBarController
    if let tabViewControllers = tabController.viewControllers 
        // First tab (only one so far...)
        let navController = tabViewControllers[0] as! UINavigationController
        let controller1 = navController.viewControllers.first as! FirstViewController
        controller1.coreDataStack = coreDataStack
    

【问题讨论】:

【参考方案1】:

因为试图强制将 LogInViewController 解包到 UITabBarController 而出现错误。

对于您的设计流程存储数据库中用户的登录状态,在设置window.rootViewController之前对此进行检查条件,如果用户是logged-in,则显示tabController,否则显示LogInViewController

        let userLogined = GET LOGIN STATUS FROM DATABSE
        if userLogined
            // Initiate Tabbar Controller object
            let tabController = INITIATE_TABBAR_CONTROLLER
            let tabViewControllers = tabController.viewControllers
            // First tab (only one so far...)
            let navController = tabViewControllers[0] as! UINavigationController
            let controller1 = navController.viewControllers.first as! FirstViewController
            controller1.coreDataStack = coreDataStack
            self.window?.rootViewController = tabController

        else
            // Login View Controller
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let loginVC = storyboard.instantiateViewController(withIdentifier: "loginVC") as! LogInViewController
            self.window?.rootViewController = loginVC
        

【讨论】:

啊,我可以看到控制流如何检查用户是否登录。谢谢洛基!【参考方案2】:

作为一种替代方法,如何始终将 rootViewController 设置为选项卡栏控制器。然后,如果用户已注销,则从标签栏控制器模态显示登录视图控制器。用户成功登录后,关闭登录视图控制器。 我在很多应用上多次使用过这种方法。

【讨论】:

谢谢。我认为 Instagram 做到了这一点,这是一个很好的实现。要设置它,我是否右键单击选项卡栏控制器中的阶段和登录视图控制器并以模态方式呈现?如果是这样,我将如何向首次使用的用户展示登录 VC?将 Sign In VC 指定为初始 VC 会使程序崩溃,因为它无法转换为 UITabBarController。 我自己不使用情节提要,因此无法提供建议。我总是将标签栏控制器创建为初始视图控制器 - 分配给根视图控制器的那个。设置好之后,检查用户是否登录,如果没有,创建登录视图控制器,然后从标签栏控制器模态显示它 - 这是根视图控制器。例如self.window?.rootViewController.present(loginVC, animated: false, completion: nil) 那是非常有用的解释。谢谢@appfigurate。

以上是关于在 UITabBarController 之前呈现登录视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

在UITabBarController之前呈现Login View Controller

在 UITabBarController 中呈现模态视图

在 UITabBarController 中呈现一个新的 UIViewControler

在呈现的 ViewController/NavigationController 上获取 UITabBarController

在演示过程中尝试在 UITabBarController 上呈现 UIImagePickerController

如何呈现嵌入在 UITabBarController 和 UINavigationBarController 中的 ViewController