如何仅在用户默认密钥不存在时才显示login屏幕?
我正在尝试开发一个应用程序(仍然在学习),在那里我提供一个login屏幕,它需要一个用户名和密码 – 然后去一个Web服务进行身份validation并返回一个访问令牌。
访问令牌然后存储在userdefaults中,然后呈现一个新的视图控制器,该视图控制器可以访问受保护的数据。
我的问题是,当我closures我的应用程序 – 强制closures,然后再次要求login。
因为我的login视图控制器是初始视图控制器,然后我添加了一个检查,以查看访问令牌是否存在userdefaults中,并呈现新的视图控制器,它允许访问受保护的数据。 现在我的问题是,login屏幕总是在我的安全视图控制器后面打开,所以当从头开始应用程序时,您可以简要地看到login视图控制器,然后呈现受保护的视图控制器。
我将如何理想地处理这个,是这样的情况下,初始视图控制器设置为安全的视图控制器时,用户默认键存在 – 但这样做,我将如何处理注销function,因为我需要'stream行'到根视图控制器和清除用户默认值,但由于login屏幕不是在视图层次结构,那么我不能回到这个? 如果在注销时出现了login视图控制器,那么受保护的视图控制器仍然存在于login视图控制器下。
对不起,如果这是一个有点长啰,但只是想描述我遇到的问题。
谢谢
你只需要在Appdelegate.swift
的application(_ 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() }