JSON请求后的IOS / Swift呈现表

时间:2015-01-22 15:46:44

标签: ios json uitableview tableview

我是IOS的新手并且很快。我正在尝试实现一个返回json的api get请求,然后将其显示在表中。以下是我目前的代码。当我运行模拟器时,我收到以下错误:

致命错误:无法索引空缓冲区

如果我删除了tableView函数中的硬编码返回3,而是使用doDatItems.count,则表中没有任何渲染,因为我猜doDatItems数组在获取get请求之前开始为空。这似乎是一个计时的事情?如何在表加载之前确保获取请求?

import UIKit

class ViewController: UIViewController, UITableViewDelegate {

    var doDatItems:[String] = []

    @IBOutlet weak var doDatItem: UITextField!

    @IBOutlet weak var yourDoDats: UILabel!

    @IBAction func addDoDat(sender: AnyObject) {

        doDatItems.append(doDatItem.text)

        println(doDatItems)
    }


    override func viewDidLoad() {
        super.viewDidLoad()

        let urlPath = "http://localhost:3000/dodats"
        let url: NSURL = NSURL(string: urlPath)!
        let session = NSURLSession.sharedSession()

        let task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
            println("Task completed")
            if((error) != nil) {
                // If there is an error in the web request, print it to the console
                println(error.localizedDescription)
            }
            var err: NSError?
            var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
            if(err != nil) {
                // If there is an error parsing JSON, print it to the console
                println("JSON Error \(err!.localizedDescription)")
            } else {
                let dataArray = jsonResult["dodats"] as [String]

                for item in dataArray {
                  self.doDatItems.append(item)
                }

//                println(self.doDatItems)

            }

        })

        task.resume()
    }

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

        return 3

    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {

        let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")

        println(self.doDatItems)

        cell.textLabel?.text = self.doDatItems[indexPath.row]

        return cell
    }


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


}

3 个答案:

答案 0 :(得分:1)

我发现了几个问题 -

  1. 你的ViewController应该符合UITableViewDatasource(缺少,不知道它是怎么走的)

  2. 当self.doDatItems没有任何项目时,请勿返回3。它会导致崩溃。只要数据加载就让表保持为空。 return self.doDatItems.count

  3. 加载数据并准备从self.doDatItems数组中显示后,只需调用表视图的reloadData()方法。

  4. 在此之前,您应该拥有tableView的引用(或IBOutlet),以便可以从任何地方调用reloadData()。

答案 1 :(得分:1)

收到并解析数据后,您需要触发页面刷新。

的内容

self.tableView.reloadData()

答案 2 :(得分:0)

在此委托方法中,返回行数

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int

不要使用静态数字作为3.获取阵列计数&在这里返回计数。

在json响应到来之后,重新加载tableView。在Objective-c中,它由

完成
[tableView reloadData];