Search code examples
iosswift3xcode8uistoryboarduistoryboardsegue

How to pass data between controllers using Storyboard in Swift 3.0?


How to pass data between controller using UIStoryboard in swift 3.0 ?

I created login (LoginViewController) and main (ViewController) page where apps keep active if user did not logout.

So far it work.

And I have these JSON value "login" that need to be passed from LoginViewController into ViewController

Some of people suggest to use perform and prepare segue.

It work but the value can only be display if it sent from LoginViewController.

ViewController did not hold the data when the page ViewController is active (when i rebuild/clean the apps).

My goal is to keep the "login" data in ViewController when page is active and clear "login" data when the page logout.

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()
    }

}

Any idea ?

Thanks.


Solution

  • You can store the value in NSUserDefaults in LoginViewController. Like below :

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

    And get the value in ViewController like this (I assume that the value is String):

    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.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){
    
    // 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()
            }
    
        }