正确的登录流程和TabBar VC

时间:2017-06-14 16:48:11

标签: ios swift swift3

从App Delegate访问标签栏以设置主屏幕快速操作时,我遇到了一些问题。以下是我用来访问标签栏的代码行。它返回假。

guard let tabBarController = self.window?.rootViewController as? UITabBarController else {return false}

应用程序启动时,我的标签栏不是我的初始VC。我有一个加载屏幕,在此期间我们验证用户令牌,然后它进入登录屏幕或标签栏控制器(也是应用程序的主要部分),具体取决于令牌是否经过身份验证。

使用登录屏幕设置应用的最佳做法是什么?我们现在这样做的方式很好但是如果有更好的方法我可以改变它。我们也使用Branch进行深度链接。

1 个答案:

答案 0 :(得分:0)

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

方法1:

这是我个人的收藏并不意味着这是唯一正确的做法。我更喜欢用LoginVC或TabBarVC替换应用程序的rootView控制器,基于令牌是否有效。 SO中有多个答案,解释了如何用适当的动画替换应用程序的rootVC。在这里粘贴相同的代码将是多余的。

为什么我使用这种方法?

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

方法2:

这是很多人使用的最简单的原因,它使用简单,但我个人不喜欢它。模拟地显示Login VC或Tab bar(两者都可能显然嵌入了UINavigationController,并且你模拟地呈现了他们的NavController,它显然加载了它的嵌入式视图控制器)。

优点:

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

    在整个应用程序生命周期中,以不必要的方式呈现的Landing VC仍然存在于应用程序导航堆栈中。我显然不喜欢这个。

    编辑:

    由于OP已明确提到他正在使用方法2而想知道如何在标签栏中选择特定的VC选择索引,更新代码显示相同。

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

    假设你的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
                    }
                }
            }
    
相关问题