2017-02-06 1 views
-1

Comment passer des données entre un contrôleur utilisant UIStoryboard dans swift 3.0?Comment transmettre des données entre les contrôleurs à l'aide de Storyboard dans Swift 3.0?

J'ai créé connexion (LoginViewController) et page principale (ViewController) où des applications rester actif si l'utilisateur n'a pas déconnecté.

Jusqu'à présent, cela fonctionne.

et moi avons ces valeurs JSON "login" qui ont besoin d'être passé de LoginViewController dans ViewController

Certaines personnes suggèrent d'utiliser exécuter et préparer Segue.

Cela fonctionne mais la valeur ne peut être affichée que si elle a été envoyée par LoginViewController.

ViewController n'a pas conservé les données lorsque la page ViewController est active (lorsque je reconstruis/nettoie les applications).

Mon but est de conserver les données de "connexion" dans ViewController quand la page est active et effacer les données de "connexion" quand la page se déconnecte.

LoginViewController.swift

import UIKit 
class LoginViewController: UIViewController { 

    @IBOutlet var _loginLbl: UITextField! 
    @IBOutlet var _pwLbl: UITextField! 
    @IBOutlet var login_button: UIButton! 

    @IBOutlet var outputLbl: UILabel! 

    var login: String! 
    var pw: String! 

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

    @IBAction func loginData(_ sender: Any) { 
     login = _loginLbl.text 
     pw = _pwLbl.text 

      let url = URL(string: "http://localhost/login.php") 
      let session = URLSession.shared 

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

      let LoginDataToPost = "login=\(login!)&pw=\(pw!)" 
      request.httpBody = LoginDataToPost.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 message = Int(json["message"]!) 
           let login = json["login"] 

           if(message == 1) { 
            UserDefaults.standard.set(true, forKey: "isUserLoggedIn") 
            UserDefaults.standard.synchronize(); 
            self.dismiss(animated: true, completion: nil) 

            let myViewController:ViewController = self.storyboard!.instantiateViewController(withIdentifier: "ViewController") as! ViewController 
            let appDelegate = UIApplication.shared.delegate as! AppDelegate 
            appDelegate.window?.rootViewController = myViewController 
            appDelegate.window?.makeKeyAndVisible() 

            self.outputLbl.text = login; 

            return 
           } 
           else { } 
          } 
         } 
         else { } 
        } catch let jsonParse {} 
       } 
      }) 
      task.resume() 
     } 
    } 
} 

ViewController.swift

import UIKit 
class ViewController: UIViewController { 
    @IBOutlet var loginLbl: UILabel! 
    var login: String! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    let preferences = UserDefaults.standard 

     if(preferences.object(forKey: "isUserLoggedIn") != nil){ 
      loginLbl.text = login 
     } 
     else { 

     } 
    } 
    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(false, forKey: "isUserLoggedIn"); 
     UserDefaults.standard.synchronize(); 
     let loginViewController = self.storyboard!.instantiateViewController(withIdentifier: "loginview") as! LoginViewController 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     appDelegate.window?.rootViewController = loginViewController 
     appDelegate.window?.makeKeyAndVisible() 
    } 

} 

Toute idée?

Merci.

+0

magasin juste votre réponse en tant que classe modèle ou le dictionnaire, et que la classe modèle ou un dictionnaire en userDefault, et vérifier à chaque n'a pas ajouté que si votre application contient des données ou non dans userdefault, si vous l'avez chargée. –

+0

Quelles sont les données que vous souhaitez enregistrer? – User511

+0

Je veux sauvegarder les données de "connexion" dans ViewController. – AlotJai

Répondre

-1

Vous pouvez stocker la valeur dans NSUserDefaults dans LoginViewController. Comme ci-dessous:

UserDefaults.standard.set(login, forKey: "loginJSONValue") 

Et obtenir la valeur dans ViewController comme ceci (je suppose que la valeur est une chaîne):

textField1.text = UserDefaults.standard.object(forKey: "loginJSONValue") as? String 

LoginViewController.swift

import UIKit 
class LoginViewController: UIViewController { 

    @IBOutlet var _loginLbl: UITextField! 
    @IBOutlet var _pwLbl: UITextField! 
    @IBOutlet var login_button: UIButton! 

    @IBOutlet var outputLbl: UILabel! 

    var login: String! 
    var pw: String! 

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

    @IBAction func loginData(_ sender: Any) { 
     login = _loginLbl.text 
     pw = _pwLbl.text 

      let url = URL(string: "http://localhost/login.php") 
      let session = URLSession.shared 

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

      let LoginDataToPost = "login=\(login!)&pw=\(pw!)" 
      request.httpBody = LoginDataToPost.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 message = Int(json["message"]!) 
           let login = json["login"] 

           if(message == 1) { 
            UserDefaults.standard.set(true, forKey: "isUserLoggedIn") 
            UserDefaults.standard.set(login, forKey: "loginJSONValue") 
            UserDefaults.standard.synchronize(); 
            self.dismiss(animated: true, completion: nil) 

            let myViewController:ViewController = self.storyboard!.instantiateViewController(withIdentifier: "ViewController") as! ViewController 
            let appDelegate = UIApplication.shared.delegate as! AppDelegate 
            appDelegate.window?.rootViewController = myViewController 
            appDelegate.window?.makeKeyAndVisible() 

            self.outputLbl.text = login; 

            return 
           } 
           else { } 
          } 
         } 
         else { } 
        } catch let jsonParse {} 
       } 
      }) 
      task.resume() 
     } 
    } 
} 

ViewController. rapide

import UIKit 
class ViewController: UIViewController { 
    @IBOutlet var loginLbl: UILabel! 
    var login: String! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    let preferences = UserDefaults.standard 

     if(preferences.object(forKey: "isUserLoggedIn") != nil){ 

// let isUserLoggedIn = UserDefaults.standard.bool(forKey: "isUserLoggedIn") 
      let isUserLoggedIn = UserDefaults.standard.object(forKey: "isUserLoggedIn") as Bool 
    // your login data is below. do what you want to do 
       login = UserDefaults.standard.object(forKey: "loginJSONValue") as String 
       if(!isUserLoggedIn){ 
        self.performSegue(withIdentifier: "loginview", sender: self) 
       } 
      loginLbl.text = login 
     } 
     else { 

     } 
    } 
    override func viewDidAppear(_ animated: Bool) { 

     } 

     @IBAction func logoutData(_ sender: Any) { 
      UserDefaults.standard.set(false, forKey: "isUserLoggedIn"); 
// After logging out, you can set empty to login data. 
UserDefaults.standard.set("", forKey: "loginJSONValue"); 
      UserDefaults.standard.synchronize(); 
      let loginViewController = self.storyboard!.instantiateViewController(withIdentifier: "loginview") as! LoginViewController 
      let appDelegate = UIApplication.shared.delegate as! AppDelegate 
      appDelegate.window?.rootViewController = loginViewController 
      appDelegate.window?.makeKeyAndVisible() 
     } 

    } 
+0

Merci pour les commentaires. Je vais l'essayer en premier. . :) – AlotJai

+0

Je ne sais pas pourquoi dans ViewController ne peut pas enregistrer la valeur de LoginViewController. . – AlotJai

+0

Dans votre code, il enregistre la valeur "isUserLoggedIn" dans UserDefaults. Vous ne sauvegardez pas la variable "login" dans UserDefaults. Il est normal que votre ViewController ne puisse pas lire la valeur "login". Et aussi je ne peux pas voir la ligne que vous essayez d'obtenir la valeur "login" de UserDefaults. Vous lisez "isUserLoggedIn" et vous le faites correctement. Essayez mon code, ça va marcher. Je l'utilise dans mes applications. –

-1

Vous devez rappeler le service de connexion et transmettre les données lors du redémarrage de l'application. ou vous pouvez stocker des données dans UserDefault et les réutiliser.

UserDefaults.standard.set(login, forKey: "loginResponse") 

Vous pouvez transmettre des données d'un contrôleur à un autre comme ci-dessous:

let myViewController:ViewController = self.storyboard!.instantiateViewController(withIdentifier: "ViewController") as! ViewController 
var loginResponse = UserDefaults.standard.get(forKey:"loginResponse") 
myViewController.your_object = loginResponse 
+0

J'ai déjà ajouté UserDefaults dans la méthode ViewController didLoad. mais ça n'a pas marché. Je ne sais pas pourquoi. BTW merci pour les commentaires .. – AlotJai

+0

cela n'a pas fonctionné. Pardon. valeur vide – AlotJai

+0

pouvez-vous me montrer un code que vous écrivez pour stocker et réessayer les données de connexion? donc je peux vous aider plus. –