在UITabBarController之前呈现Login View Controller

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在UITabBarController之前呈现Login View Controller相关的知识,希望对你有一定的参考价值。

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

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

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

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
    }
}
答案

你有错误,因为试图强行解开LogInViewControllerUITabBarController

对于你的设计流程存储用户数据库中的loginStatus在设置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
        }
另一答案

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

以上是关于在UITabBarController之前呈现Login View Controller的主要内容,如果未能解决你的问题,请参考以下文章

在UITabBarController之前呈现Login View Controller

在 UITabBarController 中呈现模态视图

在 UITabBarController 中呈现一个新的 UIViewControler

在呈现的 ViewController/NavigationController 上获取 UITabBarController

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

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