【问题标题】:I can not get the json data to display in my second UIViewController我无法在我的第二个 UIViewController 中显示 json 数据
【发布时间】:2016-09-20 13:56:20
【问题描述】:

我的第一个 ViewController 中有以下两个函数。他们加载了一个超过 300 行的 UITableView。我在 ViewDidLoad 中调用 loadRemoteData 函数。在第一个 ViewController 中一切正常。

 // MARK: - parseJSON
func parseJSON(data: NSData) {
    do {
        let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers)

        if let rootDictionary = json as? [NSObject: AnyObject], rootResults = rootDictionary["results"] as? [[NSObject: AnyObject]] {
            for childResults in rootResults {
                if let firstName = childResults["first_name"] as? String,
                    let lastName = childResults["last_name"] as? String,
                    let bioguideId = childResults["bioguide_id"] as? String,
                    let state = childResults["state"] as? String,
                    let stateName = childResults["state_name"] as? String,
                    let title = childResults["title"] as? String,
                    let party = childResults["party"] as? String {
                    let eachLegislator = Legislator(firstName: firstName, lastName: lastName, bioguideId: bioguideId, state: state, stateName: stateName, title: title, party: party)
                    legislators.append(eachLegislator)
                }
            }
        }
    } catch {
        print(error)
    }
}

// MARK: - Remote Data configuration
func loadRemoteData() {
    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session = NSURLSession(configuration: config)
    let url = "https://somedomain.com/legislators?order=state_name__asc,last_name__asc&fields=first_name,last_name,bioguide_id"
    if let url = NSURL(string: url) {
        let task = session.dataTaskWithURL(url, completionHandler: { (data, response, error) -> Void in
            if let error = error {
                print("Data Task failed with error: \(error)")
                return
            }
            if let http = response as? NSHTTPURLResponse, data = data {
                if http.statusCode == 200 {
                    dispatch_async(dispatch_get_main_queue()) {
                        self.parseJSON(data)
                        self.tableView.reloadData()
                    }
                }
            }
        })
        task.resume()
    }
}

在第二个 ViewController 中,我想显示有关被点击的单元格中列出的个人的更多信息,为此我使用了不同的 URL,例如 https://somedomain.com/legislators?bioguide_id=\"\(bioguideId)\",它为我提供了更多详细信息。 (从 JSON Dictionary 请求的数据不同)

我在第二个 ViewController 中使用的代码就像上面显示的一样,唯一的区别是 URL。我可以打印来自前一个 ViewController 的 url,它显示在控制台日志中,但没有显示 json 数据。

如果有任何帮助,我将不胜感激。 谢谢

下面是我的第二个 ViewController 的代码:

import UIKit

class DetailViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

var bioguideId: String?
var currentLegislator: Legislator? = nil
var currentLegislatorUrl: String?
let reuseIdentifier = "Cell"

@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var tableView: UITableView!

// MARK: - parseJSON
private func parseJSON(data: NSData) {
    do {
        let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers)
        if let rootDictionary = json as? [NSObject: AnyObject],
            rootResults = rootDictionary["results"] as? [[NSObject: AnyObject]] {
            for childResults in rootResults {
                if let firstName = childResults["first_name"] as? String,
                    let lastName = childResults["last_name"] as? String,
                    let bioguideId = childResults["bioguide_id"] as? String,
                    let state = childResults["state"] as? String,
                    let stateName = childResults["state_name"] as? String,
                    let title = childResults["title"] as? String,
                    let party = childResults["party"] as? String {
                    currentLegislator = Legislator(firstName: firstName, lastName: lastName, bioguideId: bioguideId, state: state, stateName: stateName, title: title, party: party)
                }
            }
        }
    } catch {
        print(error)
    }
}

// MARK: - Remote Data configuration
func loadRemoteData(url: String) {
    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session = NSURLSession(configuration: config)
    let url = currentLegislatorUrl
    if let url = NSURL(string: url!) {
        let task = session.dataTaskWithURL(url, completionHandler: { (data, response, error) -> Void in
            if let error = error {
                print("Data Task failed with error: \(error)")
                return
            }
            print("Success")
            if let http = response as? NSHTTPURLResponse, data = data {
                if http.statusCode == 200 {
                    dispatch_async(dispatch_get_main_queue()) {
                        self.parseJSON(data)
                        self.tableView.reloadData()
                    }
                }
            }
        })
        task.resume()
    }
}

func loadImage(urlString:String) {
    let imgURL: NSURL = NSURL(string: urlString)!
    let request: NSURLRequest = NSURLRequest(URL: imgURL)
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request){
        (data, response, error) -> Void in
        if (error == nil && data != nil) {
            func display_image() {
                self.imageView.image = UIImage(data: data!)
            }
            dispatch_async(dispatch_get_main_queue(), display_image)
        }
    }
    task.resume()
}

override func viewDidLoad() {
    super.viewDidLoad()
    print(currentLegislatorUrl!)
    loadRemoteData(currentLegislatorUrl!)
    loadImage("https://theunitedstates.io/images/congress/225x275/\(bioguideId!).jpg")

    self.title = bioguideId
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 5
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier, forIndexPath: indexPath)
    cell.textLabel!.text = currentLegislator?.firstName
    return cell
}

}

【问题讨论】:

  • 您是否打印了请求的响应以确保应用程序甚至可以返回 JSON?
  • 谢谢。我没有得到任何回报,但如果我在第一个视图控制器中使用第二个 URL,我可以看到数据。两个视图控制器的代码几乎相同。我不知道我做错了什么。
  • 你刚才说你没有得到任何回报。那是你的问题。请求或向您返回数据的端点一定有错误。在网络浏览器中尝试 URL,并确保在继续使用应用程序之前获取信息。
  • 该 URL 在浏览器和我的第一个 ViewController 上有效。我在第二个 ViewController 的控制台上没有得到任何东西。
  • 我为上面的第二个 ViewController 添加了代码。 URL 来自第一个 ViewController。 print(currentLegislatorUrl) 在控制台日志中显示 url,并且 url 在浏览器中有效。

标签: ios json swift nsurlsession nsurl


【解决方案1】:

感谢 Adam H。他的评论让我重新评估了我使用的 URL,并通过添加额外的运算符,现在数据显示在我的第二个 ViewController 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多