【问题标题】:How Keep session in Swift 3.0 using UserDefaults.standard?如何使用 UserDefaults.standard 在 Swift 3.0 中保持会话?
【发布时间】:2017-01-18 03:19:18
【问题描述】:

我有两 (2) 个 swift 3.0 文件。

已编辑:

我的目标是在登录成功后保持 ViewController 处于活动状态/出现。 而且我想在点击注销按钮时保持 LoginVC 处于活动状态。

一切正常,例如发布和读取 json 数据。

已编辑:

ViewController 在登录时成功激活,但是当我点击注销按钮时,停止并重新构建它,ViewController 仍然没有关闭。它应该被重定向到 LoginVC

我认为我的 UserDefaults.standard 代码可能有问题。

我的代码如下

ViewController.swift

import UIKit
class ViewController: UIViewController {

    override func viewDidLoad() { super.viewDidLoad() }

    override func viewDidAppear(_ animated: Bool) {

        let isUserLoggedIn = UserDefaults.standard.bool(forKey: "isUserLoggedIn")
        if(!isUserLoggedIn){
            self.performSegue(withIdentifier: "loginview", sender: self)
        }
    }
    @IBAction func logoutData(_ sender: Any) {
        UserDefaults.standard.set(true, forKey: "isUserLoggedIn");
        UserDefaults.standard.synchronize();
        self.performSegue(withIdentifier: "loginview", sender: self)
    }
}

LoginVC.swift

import UIKit
class LoginVC: UIViewController {
    @IBOutlet var _login: UITextField!
    @IBOutlet var _pass: UITextField!
    var login: String!
    var pass: String!

    override func viewDidLoad() { super.viewDidLoad() }

    @IBAction func loginData(_ sender: Any) {  
        login = _login.text
        pass  = _pass.text

        if(login == "" || pass == "") {
            return
        }
        else {
            let url     = URL(string: "http://localhost/login.php")
            let session = URLSession.shared

            let request = NSMutableURLRequest(url: url! as URL)
            request.httpMethod = "POST"

            let paramToLogin = "login=\(login!)&pass=\(pass!)"
            request.httpBody = paramToLogin.data(using: String.Encoding.utf8)

            let task = session.dataTask(with: request as URLRequest, completionHandler: {
                (data, response, error) in
                if error != nil {
                    return
                }
                else {
                    do {
                        if let json = try JSONSerialization.jsonObject(with: data!) as? [String: String]
                        {
                            DispatchQueue.main.async {
                                let success  = Int(json["message"]!)

                                if(success == 1){
                                    UserDefaults.standard.set(true, forKey: "isUserLoggedIn")
                                    UserDefaults.standard.synchronize();
                                    self.dismiss(animated: true, completion: nil)
                                    return
                                }
                            }
                        }
                    }
                    catch { }
                }
            })
            task.resume()
        }
    }
}

【问题讨论】:

  • 登录后应该使用set(true, forKey: "yourKey"),而不是阅读它
  • 您还需要序列化您的 JSON 数据,然后再发布它developer.apple.com/reference/foundation/jsonserialization
  • 是的。我已经更新了这个问题。但是另一个问题来了。当我点击注销按钮时。它不会终止会话。 .
  • 如果代码太长,请见谅。
  • 无需强制同步

标签: ios swift3 userdefaults


【解决方案1】:

在注销期间的代码中,值“true”也存储在 UserDefaults 中。我认为这可能是问题所在。

【讨论】:

  • 是的。我将其更改为“假”。到目前为止它有效。但我不确定我上面的代码是否是创建登录会话页面的正确方法。
  • 我认为这不是一个好方法。如果用户未登录,则必须将 LoginVC 设置为 rootViewController。用户登录后,将 rootViewController 更改为 ViewController。反之亦然。
  • 你能看看这个问题吗? stackoverflow.com/questions/41711734/….
  • 我希望其中一位开发人员回答了这个问题,这是正确的。
【解决方案2】:
let loginStroyBoard = UIStoryboard(name:"Login", bundle: nil)
let businessLoginViewController = loginStroyBoard.instantiateViewController(withIdentifier: "BusinessLoginViewController") as! BusinessLoginViewController
let refreshAlert = UIAlertController(title: "Log Out", message: "Are You Sure to Log Out ? ", preferredStyle: UIAlertControllerStyle.alert)

refreshAlert.addAction(UIAlertAction(title: "Confirm", style: .default, handler: { (action: UIAlertAction!) in
    self.present(businessLoginViewController, animated: true, completion: nil)

DispatchQueue.main.async {
    UserDefaults.standard.removeObject(forKey: "isFirstTime")
    UserDefaults.standard.removeObject(forKey: "isLogIn")
    UserDefaults.standard.removeObject(forKey: "uid")
    UserDefaults.standard.removeObject(forKey: "hash")
    UserDefaults.standard.removeObject(forKey: "storeadminid")
    UserDefaults.standard.removeObject(forKey: "adminhash")
    UserDefaults.standard.removeObject(forKey: "store_id")
    UserDefaults.standard.removeObject(forKey: "isLogIn")
    UserDefaults.standard.removeObject(forKey: "login_id")
    UserDefaults.standard.removeObject(forKey: "password")
    UserDefaults.standard.setValue(false, forKey: "islogout")
    }

    //self.tabBarController?.tabBar.resignFirstResponder()
}))

refreshAlert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action: UIAlertAction!) in
    refreshAlert .dismiss(animated: true, completion: nil)
}))

present(refreshAlert, animated: true, completion: nil)

}

我也将使用它进行注销..
你可以试试这个,我会用我的单元格注销按钮来做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-06
    • 2010-10-29
    • 1970-01-01
    • 2011-08-17
    • 2017-09-09
    • 2018-06-26
    • 2018-10-03
    • 1970-01-01
    相关资源
    最近更新 更多