Ios 正确的登录流程和TabBar VC

Ios 正确的登录流程和TabBar VC,ios,swift,swift3,Ios,Swift,Swift3,我在从应用程序代理访问选项卡栏以设置主屏幕快速操作时遇到一些问题。下面是我用来访问选项卡栏的代码行。它返回错误 guard let tabBarController = self.window?.rootViewController as? UITabBarController else {return false} 当应用程序启动时,我的选项卡栏不是我的初始VC。我有一个加载屏幕,在此期间我们对用户令牌进行身份验证,然后根据令牌是否经过身份验证,它会转到登录屏幕或选项卡栏控制器(这也是应用程

我在从应用程序代理访问选项卡栏以设置主屏幕快速操作时遇到一些问题。下面是我用来访问选项卡栏的代码行。它返回错误

guard let tabBarController = self.window?.rootViewController as? UITabBarController else {return false}
当应用程序启动时,我的选项卡栏不是我的初始VC。我有一个加载屏幕,在此期间我们对用户令牌进行身份验证,然后根据令牌是否经过身份验证,它会转到登录屏幕或选项卡栏控制器(这也是应用程序的主要部分)


设置带有登录屏幕的应用程序的最佳实践是什么?我们现在的做法很好,但如果有更好的办法,我可以改变。我们还使用Branch进行深度链接

这是一个基于意见的问题,可能存在多个答案,每个答案都可能适用于某些特定场景

方法1:

这是我个人的最爱,但并不意味着这是唯一正确的方法。我更喜欢根据令牌是否有效,将应用程序的rootView控制器替换为LoginVC或TabBarVC。在这篇文章中,有很多答案解释了如何用合适的动画替换应用程序的rootVC。粘贴相同的代码在这里是多余的

我为什么使用这种方法

使我的应用程序导航控制器堆栈保持干净,并且我不会在内存中保留任何超出实际需要的额外VC

方法2:

这是许多人使用的最简单的原因,它使用起来很简单,但我个人不喜欢它。以模态方式显示登录VC或选项卡栏(它们都可能嵌入UINavigationController,并且您以模态方式显示其NavController,这显然会加载其嵌入的视图控制器)

优点:

  • 易于编码
  • 您可以始终确保应用程序的rootVC始终是固定的,并且它已经呈现了LoginVC或TabBarVC。因此解析和访问VC变得相当简单
  • 缺点:

    在整个应用程序生命周期中,不必要地呈现在应用程序导航堆栈中的登录VC。我显然不赞成这样做

    编辑:

    正如OP清楚地提到的,他正在使用方法2,并想知道如何在选项卡栏中访问特定的VC,选择索引am更新代码显示相同

    代码不用于复制粘贴,代码可能包含语法错误。下面提供的代码仅用于提供想法

    假设您的LandVC没有嵌入UINavigationController

    if let landVC = UIApplication.shared.keyWindow?.rootViewController {
                if let presentedVC = landVC.presentedViewController {
                    if presentedVC is LoginVC {
                        //this is login VC
                    }
                    else if presentedVC is UITabBarController {
                        let currentlySelectedVC  = (presentedVC as! UITabBarController).viewControllers?[(presentedVC as! UITabBarController).selectedIndex]
                        //now check what type VC it is and use it accordingly
                    }
                }
            }
    

    因为看起来我们使用的是第二种方法,而且使用这种方法并不是不好的做法,所以在执行主屏幕快速操作时,我们如何从应用程序委托访问选项卡栏控制器来设置selectedIndex?@nevin jethmalani:请查看上面发布的代码。以上代码将帮助您从应用程序中的任何位置获取所选选项卡索引处的选项卡栏和VC。我从来没有说过第二种方法不是一种坏的做法。在我看来,第二种方法仍然不是一个好主意,因为它不必要地将VC留在内存中。我不喜欢它:)内文JyMalaN:如果有帮助,请考虑接受答案。