如何在 swift 中使用 UserDefaults 实现登录/注销导航?

Posted

技术标签:

【中文标题】如何在 swift 中使用 UserDefaults 实现登录/注销导航?【英文标题】:How I can implement Login / Logout Navigation using UserDefaults in swift? 【发布时间】:2019-10-18 05:05:30 【问题描述】:

****每次运行应用程序时,我都必须登录才能进入应用程序的主页。

当我点击登录按钮直到我点击注销按钮时,如何存储会话。

所以,我每次运行应用程序时都可以避免登录。

请帮帮我……

其他解决方案不起作用。

class LoginViewController: UIViewController 

    @IBOutlet weak var password: UITextField!
    @IBOutlet weak var loginName: UITextField!

   @IBAction func submitButton(_ sender: Any) 

  UserDefaults.standard.set(true, forKey: "isLoggedIn")

        if loginName.text == "test" && password.text == "test" 

            UserDefaults.standard.set(true, forKey: "status")
            Switcher.updateRootVC()

        
        else
            print("Invalid credentials")
        
    


class ProfileViewController: UIViewController 

@IBAction func submitButton(_ sender: Any) 

    UserDefaults.standard.set(false, forKey: "status")
    Switcher.updateRootVC()

    


class AppDelegate: UIResponder, UIApplicationDelegate 


  var window: UIWindow?

    func loadBaseController() 
       let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
       guard let window = self.window else  return 
       window.makeKeyAndVisible()
       if UserDefaults.standard.bool(forKey: "isLoggedIn") == false 
           let loginVC: ViewController = storyboard.instantiateViewController(withIdentifier: "login") as! ViewController
           self.window?.rootViewController = loginVC
        else 
           let homeVC: HomeViewController = storyboard.instantiateViewController(withIdentifier: "showData") as! HomeViewController
           let navigationHomeVC = UINavigationController(rootViewController: homeVC)
           self.window?.rootViewController = navigationHomeVC
       
      self.window?.makeKeyAndVisible()
    


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 

       self.loadBaseController()

        return true

    

我引用了此链接https://medium.com/@paul.allies/ios-swift4-login-logout-branching-4cdbc1f51e2c 的相同方法,但它没有用,因为我没有得到预期的结果。 我是正确的状态码,但不是正确的视图控制器。 请帮我解决这个问题............

在给定的链接中,它将TabbarVc 添加到tabor

【问题讨论】:

检查您在 Appdelegate 中的 isLoggedIn 值,并从 Appdelegate 文件中显示您的控制器。在 Appdelegate 文件中你想设置你的 rootView 控制器。 好的。我会检查它 我检查了,但我不知道在应用程序委托中设置值isLoggedIn 的位置 【参考方案1】:

在 Xcode 11 中,我们创建一个新项目时有 2 个文件,因此如果您想从委托文件中更改 rootViewController,则需要从 SceneDelegate.swift 文件中加载该控制器。 p>

//SceneDelegate.swift

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 
    guard let windowScene = (scene as? UIWindowScene) else  return 

    window = UIWindow(frame: windowScene.coordinateSpace.bounds)
    window?.windowScene = windowScene

    self.loadBaseController()



func loadBaseController() 
   let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
   guard let window = self.window else  return 
   window.makeKeyAndVisible()
   if UserDefaults.standard.bool(forKey: "isLoggedIn") == false 
       let loginVC: ViewController = storyboard.instantiateViewController(withIdentifier: "login") as! ViewController
       self.window?.rootViewController = loginVC
    else 
       let homeVC: HomeViewController = storyboard.instantiateViewController(withIdentifier: "showData") as! HomeViewController
       let navigationHomeVC = UINavigationController(rootViewController: homeVC)
       self.window?.rootViewController = navigationHomeVC
   
    self.window?.makeKeyAndVisible()

【讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 SceneDelegate.swift我没有这个文件....我的项目是上周在 Xcode 11 中创建的,我刚刚更新了我的 xcode 检查我通过引用媒体链接medium.com/@paul.allies/… 尝试的更新代码,但仍然没有得到答案.... 我可以在 AppDelegate.swift 中添加相同的代码吗,因为我在 xcode10 中创建了项目。当我创建演示时,这对我有用 当我在真实的应用程序中尝试时,我的应用程序崩溃了【参考方案2】:

您必须使用 SceneDelegate 来解决此问题,如先前评论中所述。 但是如果你仍然想使用 Switcher Class 来做到这一点。 这是解决方案: Add-> private(set) static var shared: SceneDelegate? and Self.shared = self Switcher.updateRootVC()

在添加这些行之后。 现在像这样编辑 Switcher 类:

Modify the switcher class like this.

现在您可以使用切换器类从任何地方切换..

【讨论】:

以上是关于如何在 swift 中使用 UserDefaults 实现登录/注销导航?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中持久存储大量数据

检查 UserDefault 是不是存在 - Swift

将值附加到数据数组并保存在 Userdefault swift

swift Userdefault标准保存/加载

如何在swift中将json数组保存和检索到用户默认值?

如何在 UserDefault 中存储推送通知警报消息?