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

Posted

技术标签:

【中文标题】如何在 Swift 3.0 中的控制器之间传递 JSON 数据?【英文标题】:How do I pass JSON data between controller in Swift 3.0? 【发布时间】:2017-01-19 11:01:27 【问题描述】:

我有这些 JSON 数据:

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

在 Swift 3.0 中,我创建了两个文件,分别是 LoginVC 和 ViewController。

只有在 LoginVC 验证凭据后才能访问 ViewController。到目前为止,我设法使登录访问基于数据库中的“成功”JSON 数据的 ViewController 页面。

但我的下一个目标是将 JSON 数据“[login]”从 LoginVC 传递到 ViewController

在 ViewController 中,我创建了 UILabel "loginLbl" 来显示来自 LoginVC 的 JSON 值。

如何更新我的代码?

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

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

    var passedData: String!

    override func viewDidLoad() 
        super.viewDidLoad()

        loginLbl.text = passedData
    

如何将其传递给UILabel loginLbl

【问题讨论】:

Passing Data between View Controllers in Swift的可能重复 是的,我知道这个问题可能是重复的。但我仍然对如何传递数据感到困惑。 . @AlotJai 您的代码中没有导航代码。 你的意思是从 LoginVC 导航到 ViewController ? @AlotJai 是的,我正在考虑导航。 【参考方案1】:

一旦您在响应中确定登录数据是正确的,您需要将 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)
                            

【讨论】:

感谢您的回复。让我先试试。谢谢:D "dictJson" 来自哪里? 在您已将 IBOutlet 用于 loginlbl 的视图控制器中放置此 dictJson 属性。让 dictJson = Dictionary()【参考方案2】:
 if(success == 1)
           self.outputLbl.text = loginvaluefromdb;
           // Here you trigger the segue
           self.performSegue(withIdentifier: "goToViewController", sender: loginvaluefromdb)
           return
         

您需要在为 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)")
        
    

【讨论】:

以上是关于如何在 Swift 3.0 中的控制器之间传递 JSON 数据?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中的视图控制器之间传递数据

如何在 Swift 中的视图之间传递数据

在 Swift 中的视图控制器之间传递自定义类数据

在 Swift 中的页面视图控制器内的视图控制器之间传递数据

在 Swift 中的 ONE ViewController 中的视图之间传递数据

swift 4 中使用 performSegue 打开的关闭页面时,如何在视图控制器和 TableViewController 之间传递数据?