如何使用 post 方法将 JSON 数据从登录功能传递到另一个视图控制器?

Posted

技术标签:

【中文标题】如何使用 post 方法将 JSON 数据从登录功能传递到另一个视图控制器?【英文标题】:How to pass JSON data to another view controller from login function using post method? 【发布时间】:2017-06-28 05:37:33 【问题描述】:

我在另一个视图控制器中有空白数据,我可以在表视图控制器之间传递数据,但是我无法从登录方法解析数据并从 JSON 传递访问令牌或用户名?

 @IBOutlet weak var username_textfield: UITextField!
    @IBOutlet weak var password_textfield: UITextField!
var logindata : [Login] = []
 var myResponse  :   JSON    =   nil
func getlogin()
        let headers = [
            "Content-Type": "application/x-www-form-urlencoded"
        ]
        let parameters = [

            "UserName": username_textfield.text! as String,
            "Password": password_textfield.text! as String,
            "grant_type": "password",
            ]


        //        let url = NSURL(string: "http://192.168.100.5:84/Token")!
        Alamofire.request("http://192.168.100.5:84/Token", method: .post, parameters: parameters, encoding:  URLEncoding.httpBody, headers: headers).responseJSON  (response:DataResponse<Any>) in

            switch(response.result) 
            case.success(let data):
                print("success",data)
                 let statusCode = (response.response?.statusCode)!
                if statusCode == 200
                    self.view.makeToast(message: "Welcome !!")
                    self.performSegue(withIdentifier: "mainview", sender: self)

                else
                    self.view.makeToast(message: "Username or password invalid")
                
                self.myResponse = JSON(data)
            let login = Login(loginJson: self.myResponse)
            DispatchQueue.main.async(execute:  () -> Void in
                self.performSegue(withIdentifier: "pass_data", sender: login)
            )


            case.failure(let error):
                print("Not Success",error)
            

        
    

将数据传递给另一个视图控制器

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "pass_data" 
        if let eventsVC = segue.destination as? MenuDrawerViewController,
            let loginData = sender as? Login 
            eventsVC.login_details = loginData
        
    

我有模型课

class Login

    var access_token = String()
    var token_type = String()
    var expire_in = String()
    var username = String()
    var masterid = String()
    var name = String()
    var access = String()
    var issued = String()
    var expries = String()

    init(loginJson:JSON)
    self.access_token = loginJson["access_token"].stringValue
        self.token_type = loginJson["token_type"].stringValue
        self.expire_in = loginJson["expires_in"].stringValue
        self.username = loginJson["userName"].stringValue
        self.masterid = loginJson["MasterID"].stringValue
        self.name = loginJson["Name"].stringValue
        self.access = loginJson["Access"].stringValue
        self.issued = loginJson[".issued"].stringValue
        self.expries = loginJson[".expires"].stringValue
    



在第二个视图控制器中我有这样的调用类

class MenuDrawerViewController: UIViewController 
var login_details : Login?
 override func viewDidLoad() 
        super.viewDidLoad()



        titlename_text.text = login_details?.name
        // Do any additional setup after loading the view.
    

我有点困惑我哪里做错了或者我做错了什么 请问如何解决?

我想通过导航控制器传递数据并且不使用导航控制器数据传递所以我尝试这个函数传递它给我“if let detailController”条件下的错误

override  func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "dashboard" 
            let navController = segue.destination as! UINavigationController
           if let detailController = navController.topViewController as! ViewController,
            let loginData = sender as? Login 
                detailController.login_details = loginData
            
        
    

【问题讨论】:

您是否获得了多个登录对象?用户数组,如果不需要,您需要向我们展示您的 JSON 响应 不,我会在登录用户名、密码和访问我的访问令牌、名称时获得单个对象 成功 ".expires" = "2017 年 6 月 29 日星期四 05:19:17 GMT"; ".issued" = "2017 年 6 月 28 日星期三 05:19:17 GMT";访问 = 4; MasterID = S0095;姓名 = “卡尔文·帕特森”; “ACCESS_TOKEN”= “GipKW2FcKD-YFF_2vv_HtVzeI6ziBcKeI9PuNFHtGFJYFU_A1vDhnJcvF-ad0rMmKR7TpOESoQl1WdQ588gJoWS8BjJRUi1-qnhOcJR5fLjHio5Bv-SMavIv4BYMV17Akq3s3v7HG7p_5ZTbUMsqga7ewB3JdAt_jaiKcuShku2Bf3cq0sYf1CIABsqmRjbVpzsGX30K5mIEF”; “expires_in”= 86399; "token_type" = 持有者;用户名 = cal0095; 我有成功的 JSON 数据,现在我想解析该名称并将令牌访问另一个视图? as! 更改为 as?,因为您正在使用 if let 【参考方案1】:

For loop 这里是不必要的,因为您没有获取登录数据数组,您需要直接使用self.myResponse 来创建Login 的对象。此外,您使用不同的标识符执行 segue 两次,使用相应的目标控制器执行特定标识符的 segue。

Alamofire.request("http://192.168.100.5:84/Token", method: .post, parameters: parameters, encoding:  URLEncoding.httpBody, headers: headers).responseJSON  (response:DataResponse<Any>) in

    switch(response.result) 
        case.success(let data):
            print("success",data)
            let statusCode = (response.response?.statusCode)!
            if statusCode == 200
                self.view.makeToast(message: "Welcome !!")
            else
                self.view.makeToast(message: "Username or password invalid")
            
            self.myResponse = JSON(data)
            let login = Login(loginJson: self.myResponse)
            DispatchQueue.main.async(execute:  () -> Void in
               self.performSegue(withIdentifier: "pass_data", sender: login)
            )
        case.failure(let error):
            print("Not Success",error)
    

现在让你的prepareForSegue 像这样

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "pass_data" 
        if let eventsVC = segue.destination as? MenuDrawerViewController,
           let loginData = sender as? Login 
              eventsVC.login_details = loginData
        
    

【讨论】:

所以在这个方法中我如何传递给另一个视图控制器覆盖 func prepare(for segue: UIStoryboardSegue, sender: Any?) if segue.identifier == "pass_data" if let eventsVC = segue .destination as? MenuDrawerViewController // let passvalue : Login for passvalue in logindata eventsVC.login_details = passvalue 对不起,我重新加载页面晚了,在 MenuDrawerViewController 中,它怎么能被称为它在标签名称中显示空白 @BikeshThakur 您是否使用mainview 删除了执行segue 调用,因为在您的问题代码中,如果仍然无法正常工作,您正在使用两个不同的标识符执行segue,然后使用您当前的尝试代码与preparefor 编辑您的问题继续 @BikeshThakur 你还没有删除 for 循环也没有从 if 条件 if statusCode == 200 中删除执行 segue 再次检查我的解决方案,你需要让你的成功案例和我的一样跨度>

以上是关于如何使用 post 方法将 JSON 数据从登录功能传递到另一个视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 POST json 中获取数据

如何将 JSON 作为参数传递给控制器​​ .net api 中的 Post 方法

如何将json POST数据作为对象传递给Web API方法?

如何将 JSON 数据从登录视图传递到多个视图控制器,是不是可能?

使用 JSON 格式的 POST 方法 web api 将动态输入提交到数据库

将 POST 数据从 Android 应用程序发送到 PHP MySQL