【问题标题】:How do I pass JSON data between controller in Swift 3.0?如何在 Swift 3.0 中的控制器之间传递 JSON 数据?
【发布时间】: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

【问题讨论】:

  • 是的,我知道这个问题可能是重复的。但我仍然对如何传递数据感到困惑。 .
  • @AlotJai 您的代码中没有导航代码。
  • 你的意思是从 LoginVC 导航到 ViewController ?
  • @AlotJai 是的,我正在考虑导航。

标签: ios json swift3 uilabel xcode8


【解决方案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)")
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-23
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    相关资源
    最近更新 更多