【问题标题】:How to pass data between controllers using Storyboard in Swift 3.0?如何在 Swift 3.0 中使用 Storyboard 在控制器之间传递数据?
【发布时间】:2017-06-23 00:04:53
【问题描述】:

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

我创建了 login (LoginViewController)ma​​in (ViewController) 页面,如果用户没有注销,应用程序会在其中保持活动状态。

到目前为止它有效。

我有这些 JSON 值 "login" 需要从 LoginViewController 传递到 ViewController

有些人建议使用perform and prepare segue

它可以工作,但只有从 LoginViewController 发送的值才能显示。

当页面 ViewController 处于活动状态时(当我重建/清理应用程序时),ViewController 没有保存数据。

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

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

}

有什么想法吗?

谢谢。

【问题讨论】:

  • 只需将您的响应存储为模型类或字典,并将该模型类或字典存储到 userdefault 中,并在每次 didlaunchwithfinish 时检查它,如果您的应用在 userdefault 中是否有数据,是否已加载。
  • 你要保存什么数据?
  • 我想将“登录”数据保存到 ViewController。
  • @RahulPatel 我应该在哪个页面上设置该数据?
  • @AlotJai 在 LoginViewController 下 if let json = try JSONSerialization.jsonObject(with: data!) as? [String: String] { } 我认为您获得了一些基于特定用户登录的用户数据。

标签: ios swift3 xcode8 uistoryboard uistoryboardsegue


【解决方案1】:

您可以将值存储在 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()
        }

    }

【讨论】:

  • 感谢您的反馈。我先试试看。 . :)
  • 我不确定为什么在 ViewController 中无法保存 LoginViewController 的值。 .
  • 在您的代码中,它将“isUserLoggedIn”值保存到 UserDefaults。您没有将“登录”变量保存到 UserDefaults。您的 ViewController 无法读取“登录”值是正常的。而且我也看不到您尝试从 UserDefaults 获取“登录”值的行。您阅读了“isUserLoggedIn”并且您做对了。试试我的代码,它会工作。我在我的应用程序中使用它。
  • 我还是很困惑。 .你能在你的答案上更新我上面的代码吗?谢谢
  • 更新了,检查一下。
【解决方案2】:

需要在应用重启时再次调用登录服务并传递数据。或者您可以将数据存储在 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

【讨论】:

  • 我已经在 ViewController didLoad 方法中添加了 UserDefaults。但它没有用。我不知道为什么。顺便提一句 。感谢您的反馈..
  • 你能告诉我你为存储和重试登录数据编写的代码吗?所以我可以帮助你更多。
  • 在 LoginViewController.swift 中。 .在 if 语句块 where if (message == 1)
  • 它在 if 语句中 ("if message == 1") 我存储数据:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
相关资源
最近更新 更多