如何将JSON的值放入TableView

时间:2019-06-27 14:50:14

标签: ios arrays swift

我是IOS应用程序开发的初学者,我想将JSON文件的所有键的值添加到tableView中。

我尝试了下面的代码,但tableView仍然为空。

import UIKit

class ViewController: UIViewController,UITableViewDelegate, UITableViewDataSource {

var arraylist = [String]()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let session = URLSession.shared
    let url = URL(string: "http://country.io/names.json")!

    let task = session.dataTask(with: url) { data, response, error in

        do {
            if let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String: String] {
                 for (key, value) in json {
                    let someString = value
                    self.arraylist.append(someString)
                 }
            }
        } catch {
            print("JSON error: \(error.localizedDescription)")
        }
    }
    task.resume()
}

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return(arraylist.count)
}

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")
    cell.textLabel?.text = arraylist[indexPath.row]

    return cell
}

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


}

3 个答案:

答案 0 :(得分:1)

  • 首先检查是否

      表格视图的
    • datasourcedelegate已连接到Interface Builder中的视图控制器。
    • 原型单元格的标识符设置为cell
  • 为表视图添加IBOutlet并将其连接到Interface Builder

    @IBOutlet weak var tableView : UITableView!
    
  • 为数据源数组赋予一个更有意义且不太委婉的名称

    var countries = [String]()
    
  • 填充数据源数组后,在主线程上重新加载表视图

    if let json = try JSONSerialization.jsonObject(with: data!) as? [String: String] {
        // easier way to get the country names
        self.countries = json.values.sorted()
        DispatchQueue.main.async {
           self.tableView.reloadData()
        }
    }
    
  • 总是dequeue个单元格

    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = countries[indexPath.row]
        return cell
    }
    

return不是一个函数(没有括号)

return countries.count

答案 1 :(得分:0)

获取新数据后,用新数据重新加载tableView。 也。如果还没有,请让您的视图控制器/视图成为tableView的委托。

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.

self.tableView.delegate = self
self.tableView.dataSource = self

let session = URLSession.shared
let url = URL(string: "http://country.io/names.json")!

let task = session.dataTask(with: url) { data, response, error in

    do {
        if let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String: String] {
             for (key, value) in json {
                let someString = value
                self.arraylist.append(someString)
             }
             self.tableView.reloadData()
        }
    } catch {
        print("JSON error: \(error.localizedDescription)")
    }
}
task.resume()

}

答案 2 :(得分:0)

只需在代码块的末尾添加self.tableView.reloadData()即可,

do {
   if let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String: String] {
      for (key, value) in json {
      let someString = value
      self.arraylist.append(someString)
      self.tableView.reloadData()
   }
}
} catch {
   print("JSON error: \(error.localizedDescription)")
}