【问题标题】:Swift 2, Parsing JSON, empty responseSwift 2,解析 JSON,空响应
【发布时间】:2016-03-10 04:09:13
【问题描述】:

我最近使用 PHP 和 AJAX 制作了一个基于 Web 的单屏应用程序。我想将这个应用程序移植到 iOS,并开始自学 Swift。我让应用程序在 Swift 1 中完美运行,但由于我更新到 xCode 7.2 和 Swift 2,以便我可以在装有 iOS 9 的 iPhone 上试用该应用程序,因此代码完全不起作用。从这里开始,我现在有了新代码,据我所知,它应该可以工作,但我得到的响应是空的。怎么了?

import UIKit
import Foundation

class LoginViewController: UIViewController, UITextFieldDelegate {



    @IBOutlet weak var username_textField: UITextField!

    @IBOutlet weak var password_TextFieldOutlet: UITextField!


    @IBAction func password_TextFieldAction(sender: AnyObject) {


        let username = username_textField.text
        let password = password_TextFieldOutlet.text
        var urlRequest = "~~URL~~/login.php?username=\(username)&password=\(password)"



    }


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

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

我的想法是从数据库中获取我的数据并查看“成功”(数据库中的布尔值)是否返回 1 或 0。如果返回 1,则执行转到下一页,如果不是,创建一个提示用户名和密码不正确的警报。

提前谢谢你!

【问题讨论】:

  • 但是你的代码没有这样做!!它只是初始化变量。
  • @CnchalRaj 我明白,我找不到解决方案来让它工作 - 我是说我不明白如何从 URL 中检索 json 数据
  • 你的password_TextFieldAction 是什么?是单击按钮还是在 textField 上进行修饰 ==
  • @Lee 这是文本字段在退出时结束时的操作

标签: php ios swift


【解决方案1】:
  1. 创建网址

    let url = NSURL(string: "http://google.com")

  2. 创建请求

    let request = NSMutableUrlRequest(url: url!)

  3. 添加数据和请求方法

    request.HTTPMethod = "POST" request.HTTPBody = "username=\(username text.text!)".dataUsingEncoding(NSUTF8StringEncoding)

  4. 发送连接

      NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { 
         (response, data, error) -> Void in
     if data != nil && error == nil {
         if let response = String(data: data!, encoding: NSUTF8StringEncoding) { 
              //here is where you now have your response 
         }
     })
    

【讨论】:

  • 建议使用 NSURLSession 而不是 NSURLConnection。
  • @ryantxr 虽然从 php 文件发送的编码是 JSON
【解决方案2】:

对网络请求使用 NSURLConnectionDelegate 或 AFNetworking。以下是使用NSURLConnection 的实现。

我已经为你实现了LoginViewController 类。 将以下 loginButtonAction 挂钩到 UI 上的“登录/登录/完成”按钮。

import UIKit
import Foundation
class LoginViewController: UIViewController, NSURLConnectionDelegate {
@IBOutlet weak var username_textField: UITextField!
@IBOutlet weak var password_TextFieldOutlet: UITextField!
@lazy var data = NSMutableData()

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

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    startConnection()
}

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

func startConnection(){
let username = username_textField.text
    let password = password_TextFieldOutlet.text
    let urlPath: String = "~~URL~~/login.php?username=\(username)&password=\(password)"
    var url: NSURL = NSURL(string: urlPath)
    var request: NSURLRequest = NSURLRequest(URL: url)
    var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)
    connection.start()
}

func connection(connection: NSURLConnection!, didReceiveData data: NSData!){
    self.data.appendData(data)
}

func loginButtonAction(sender: UIButton!){
    startConnection()
}

func connectionDidFinishLoading(connection: NSURLConnection!) {
    var err: NSError
    var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
//Here I am printing the results, you can check the results and based on response Bool you can perform segue to next view controller.
    println(jsonResult)

}
}

【讨论】:

  • 您可以将您的代码发送到 rajchanchalkhatri@gmail.com 吗?让我为你修好它。
猜你喜欢
  • 2021-07-22
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
相关资源
最近更新 更多