简体   繁体   English

如何在Swift 3.0的控制器之间传递JSON数据?

[英]How do I pass JSON data between controller in Swift 3.0?

I have these JSON data: 我有这些JSON数据:

{"login":"ET001","email":"email@try.com"}

In Swift 3.0, I created two files which are LoginVC and ViewController. 在Swift 3.0中,我创建了两个文件LoginVC和ViewController。

ViewController can only be accessed after LoginVC verified the credentials. 仅在LoginVC验证凭据后才能访问ViewController。 So far I managed to make the login access the ViewController page based on "success" JSON data from database. 到目前为止,我已经成功地基于数据库中的“成功” JSON数据使登录名访问ViewController页面。

But my next goal is to pass the JSON data "[login]" from LoginVC into ViewController . 但是我的下一个目标是将LoginVC中的JSON数据“ [login]”传递给ViewController

In ViewController, I created UILabel "loginLbl" to display the JSON value from LoginVC. 在ViewController中,我创建了UILabel“ loginLbl”以显示LoginVC的JSON值。

How do update my code? 如何更新我的代码?

LoginVC.swift LoginVC.swift

import UIKit
class LoginVC: UIViewController {

    @IBOutlet var _login: UITextField!
    @IBOutlet var _pass: UITextField!
    @IBOutlet var outputLbl: UILabel!

    var login: String!
    var pass: String!

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

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "tocey"{
        if let destination = segue.destination as? ViewController {
            destination.passedData = self.outputLbl.text
            print("Sender value is : \(sender)")
        }
    }
}

@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["success"]!)
                            let loginvaluefromdb = json["login"]
                            if(success == 1){
                                    self.outputLbl.text = loginvaluefromdb;

                                    let abc = json["login"]
                                    self.performSegue(withIdentifier: "tocey", sender: abc)
                                    return
                                }
                            }
                        }
                    }
                    catch {
                    }
                }
            })
            task.resume()
        }
    }
}

ViewController.swift ViewController.swift

import UIKit
class ViewController: UIViewController {
    @IBOutlet var loginLbl: UILabel!

    var passedData: String!

    override func viewDidLoad() {
        super.viewDidLoad()

        loginLbl.text = passedData
    }
}

How to pass it into UILabel loginLbl ? 如何将其传递到UILabel loginLbl

Once you identify that login data is correct in your response you need to push your viewController in navigation controller and take one dictionary in your viewController and assign json to that dictionary. 一旦确定响应中的登录数据正确无误,就需要在导航控制器中推送viewController并在viewController中获取一个字典,然后将json分配给该字典。

if let json = try JSONSerialization.jsonObject(with: data!) as? [String: String] {
                        DispatchQueue.main.async {
                            let success  = Int(json["success"]!)
                            let loginvaluefromdb = json["login"]
                            if(success == 1){
                                let viewController = self.storyboard?.instantiateViewController(withIdentifier: "yourViwController") as! yourViwController
                    viewController.dictJson = json
                    self.navigationController?.pushViewController(viewController, animated: true)
                            }
 if(success == 1){
           self.outputLbl.text = loginvaluefromdb;
           // Here you trigger the segue
           self.performSegue(withIdentifier: "goToViewController", sender: loginvaluefromdb)
           return
         }

You need to pass the data in prepare for segue method : Here is the editec code 您需要传递数据以准备segue方法:这是editec代码

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "goToViewController" {
        if let destination = segue.destination as? ViewController {
            // Here you will copy tha data you want to pass
            destination.passedData = sender as? String
            print("Sender Value: \(sender)")
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM