2017-01-18 60 views
0

我有兩個(2)swift 3.0文件。如何使用UserDefaults.standard將會話保存在Swift 3.0中?

編輯:

我的目標是保持積極的ViewController /出現登錄後就是成功。 我想在註銷按鈕命中時保持LoginVC激活狀態。

一切工作正常,如發佈和讀取JSON數據。

編輯:

的loggedIn的時候,但是當我打註銷按鈕,停止並重新構建它,視圖控制器仍然不能排除

視圖控制器成功激活。它應該重定向到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() 
     } 
    } 
} 
+0

你應該使用'set(true,forKey:「yourKey」)'而不是在你登錄後讀取它 –

+0

你還需要在發佈之前序列化你的JSON數據https://developer.apple.com/reference/foundation/jsonserialization –

+0

是的。我已經更新了這個問題。但是還有另一個問題。當我點擊註銷按鈕。它不殺死會話。 。 – AlotJai

回答

2

在您的代碼註銷期間也值了 「真」 的存儲UserDefaults。我認爲這可能是問題。

+0

是的。我把它改成'假'。到目前爲止它的工作。但我不確定上面的代碼是否是創建登錄會話頁面的正確方法。 – AlotJai

+0

我認爲這不是一個好方法。如果用戶未登錄,則必須將LoginVC設置爲rootViewController。一旦用戶登錄,將rootViewController更改爲ViewController。對於註銷,反之亦然。 –

+0

你可以看看這個問題嗎? HTTP://計算器。com/questions/41711734/appdelegate-didfinishlaunchingwithoptions-launchoptions-terminating-with-uncau。 – AlotJai

1
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) 

}

我也將採用這種用於註銷..
你可以試試這一個,我會與我的註銷按鈕細胞做。