如何在 Swift 3.0 中使用 Storyboard 在控制器之间传递数据?

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

如何在 swift 3.0 中使用 UIStoryboard 在控制器之间传递数据?

我创建了 login (LoginViewController)main (ViewController) 应用程序保持活动的页面如果用户没有注销。

到目前为止它有效。

我有这些 JSON 值 "login" 需要从 LoginViewController[=46 传递=] 变成 ViewController

有些人建议使用 执行和准备 segue

有效,但只有从登录ViewController发送时才能显示该值。

ViewController 在页面 ViewController 处于活动状态时(当我 rebuild/clean 应用程序时)没有保存数据。

我的目标是在页面处于活动状态时将 "login" 数据保留在 ViewController 中,并在页面注销时清除 "login" 数据。

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

}

有什么想法吗?

谢谢。

您可以将值存储在 LoginViewController 的 NSUserDefaults 中。如下所示:

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

然后像这样获取 ViewController 中的值(我假设该值是 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()
        }

    }

您需要重新调用登录服务,并在应用重启时传递数据。或者您可以将数据存储在 UserDefault 中并重新使用它。

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

您可以将数据从一个控制器传递到另一个控制器,如下所示:

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