如何仅在用户默认密钥不存在时才显示login屏幕?

我正在尝试开发一个应用程序(仍然在学习),在那里我提供一个login屏幕,它需要一个用户名和密码 – 然后去一个Web服务进行身份validation并返回一个访问令牌。

访问令牌然后存储在userdefaults中,然后呈现一个新的视图控制器,该视图控制器可以访问受保护的数据。

我的问题是,当我closures我的应用程序 – 强制closures,然后再次要求login。

因为我的login视图控制器是初始视图控制器,然后我添加了一个检查,以查看访问令牌是否存在userdefaults中,并呈现新的视图控制器,它允许访问受保护的数据。 现在我的问题是,login屏幕总是在我的安全视图控制器后面打开,所以当从头开始应用程序时,您可以简要地看到login视图控制器,然后呈现受保护的视图控制器。

我将如何理想地处理这个,是这样的情况下,初始视图控制器设置为安全的视图控制器时,用户默认键存在 – 但这样做,我将如何处理注销function,因为我需要'stream行'到根视图控制器和清除用户默认值,但由于login屏幕不是在视图层次结构,那么我不能回到这个? 如果在注销时出现了login视图控制器,那么受保护的视图控制器仍然存在于login视图控制器下。

对不起,如果这是一个有点长啰,但只是想描述我遇到的问题。

谢谢

你只需要在Appdelegate.swiftapplication(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?)方法来判断。

但前提是你应该手动操作窗口:

在你的info.plist删除这一行: 在这里输入图像说明

然后在你的AppDelegate.swift你可以手动设置你的窗口:

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. self.window = UIWindow.init(frame: UIScreen.main.bounds) let sb:UIStoryboard = UIStoryboard.init(name: "Main", bundle: nil) let isLogin:Bool = UserDefaults.standard.bool(forKey: "isLogin") if isLogin { let vc2 = sb.instantiateViewController(withIdentifier: "ViewController2") self.window?.rootViewController = vc2 }else { let vc1 = sb.instantiateViewController(withIdentifier: "ViewController") self.window?.rootViewController = vc1 } self.window?.makeKeyAndVisible() return true } 

并在你的ViewController.swift (你可以把它看作LoginVc):

 override func viewDidLoad() { super.viewDidLoad() /* add userdefaults */ UserDefaults.standard.set(true, forKey: "isLogin") UserDefaults.standard.synchronize() }