Swift 3在Tableview中加载JSON

时间:2016-11-08 22:34:48

标签: json tableview swift3

我目前正在开发一个应用程序,我想在TableView中显示从JSON网页获取的数据...我的代码将JSON数据保存在数组中已经可以正常打印它们每次都在控制台中,但数据并没有加载到tableview中,我尝试了几乎所有的东西:更改单元格标识符,使用自定义单元格等等......有关如何解决此问题的任何想法?

import UIKit

class TableViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    var names: [String] = []
    var rating: [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        let url=URL(string:"https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=51.0460761,3.7286716&radius=300&type=bar&key=AIzaSyCpHkY1s-qZjTOyTvDjMgD6hr5VTtEOgpU")

        do {

            let allContactsData = try Data(contentsOf: url!)
            let allContacts = try JSONSerialization.jsonObject(with: allContactsData, options: JSONSerialization.ReadingOptions.allowFragments) as! [String : AnyObject]
            if let arrJSON = allContacts["results"] {
                for index in 0...arrJSON.count-1 {

                    let aObject = arrJSON[index] as! [String : AnyObject]

                    names.append(aObject["name"] as! String)
                    rating.append(aObject["id"] as! String)
                }
            }

            print(names)
            print(rating)

            self.tableView.reloadData()
        }
        catch {

        }
    }


    func tableView(_ tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
        return names.count;
    }
    func tableView(_ tableView: UITableView!, didSelectRowAtIndexPath indexPath: IndexPath!) {
        print("You selected name : "+names[indexPath.row])
    }

    func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell{
        var cell = tableView.dequeueReusableCell(withIdentifier: "cell")

        if !(cell != nil) {
            cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cell")
        }
        cell?.textLabel?.text=self.names[indexPath.row]
        cell?.detailTextLabel?.text = self.rating[indexPath.row]
        return cell!
    }

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

    override func viewWillAppear(_ animated: Bool) {
        // Hide the navigation bar on the this view controller
        self.navigationController?.setNavigationBarHidden(true, animated: true)
    }

    override func viewWillDisappear(_ animated: Bool) {
        // Show the navigation bar on other view controllers
        self.navigationController?.setNavigationBarHidden(false, animated: true)
    }


}

As you can see he gives me the 2 lists...

2 个答案:

答案 0 :(得分:0)

通过此链接查看我的回答... Why is data not displayed when viewDidLoad finished in swift?

原因很可能是您没有将dataSource的{​​{1}}和delegate设置为自我。请尝试在tableView中添加此代码。希望您的问题能够得到解决

viewDidLoad()

答案 1 :(得分:0)

您的班级TableViewController无法确认UITableViewDelegateUITableViewDataSource,您也没有设置tableView.dataSource = selftableView.delegate = self

使用以下代码段

  class TableViewController: UIViewController, UITableViewDelegate,  UITableViewDataSource {
      override func viewDidLoad() {
       super.viewDidLoad()
         tableView.dataSource = self
         tableView.delegate = self
      }
}