UITableView,cellForRowAt没有调用indexPath

时间:2018-03-10 15:25:36

标签: ios swift uitableview tableview

我一直在为SpaceX创建一个启动数据库,并且我已成功解析了我的数据,但是创建数据并将数据添加到单元格的功能无效。我已经添加了代理和数据源,但我仍然无法找到它为什么不能运行。

import UIKit

struct launchData : Decodable
{
    let flight_number : Int
    let launch_date_utc : String

    struct rocketInfo : Decodable
    {
        let rocket_name : String
    }

    let rocket : rocketInfo
}

class LaunchViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var launchTableView: UITableView!

    var arrayOfLaunchData:[launchData] = []

    override func viewDidLoad()
    {
        super.viewDidLoad()

        self.launchTableView.delegate = self
        self.launchTableView.dataSource = self

        getJsonData()

        self.launchTableView.reloadData()
    }

    func getJsonData()
    {
        let jsonUrlString = "https://api.spacexdata.com/v2/launches"
        guard let url = URL(string: jsonUrlString) else { return }

        URLSession.shared.dataTask(with: url) { (data, response, err) in

            guard let data = data else { return }

            do {
                let launchDataDecoded = try JSONDecoder().decode([launchData].self, from: data)
                print(launchDataDecoded)
            } catch let jsonErr {
                print("Error Serialization json:", jsonErr )
            }
        }.resume()
        print("getJsonData ran")
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print("")
        print(arrayOfLaunchData.count)
        print("")
        print("TableView number of rows ran")

        return arrayOfLaunchData.count
    }

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

        let launch = self.arrayOfLaunchData[indexPath.row]

        let flightNumber = launch.flight_number
        let rocketName = launch.rocket.rocket_name

        cell?.textLabel?.text = "Mission " + String(flightNumber)

        let launchDate = launch.launch_date_utc
        cell!.detailTextLabel!.text = "Launch Date: " + launchDate + "Rocket Used: " + rocketName

        self.launchTableView.reloadData()

        print("TableView cellForRowAt ran")
        return cell!
    }
}

2 个答案:

答案 0 :(得分:3)

首先从不reloadData()中致电cellForRowAt!删除行

两个主要问题:

  1. reloadData()过早被召唤。
  2. 接收数据后未填充数据源数组。
  3. 解决方案是删除行

    self.launchTableView.reloadData()
    

    (也)在viewDidLoad()中并将getJsonData()更改为

    func getJsonData()
    {
        let jsonUrlString = "https://api.spacexdata.com/v2/launches"
        guard let url = URL(string: jsonUrlString) else { return }
    
        URLSession.shared.dataTask(with: url) { (data, response, err) in
    
            guard let data = data else { return }
    
            do {
                self.arrayOfLaunchData = try JSONDecoder().decode([launchData].self, from: data)
                print(launchDataDecoded)
                DispatchQueue.main.async {
                    self.launchTableView.reloadData()
                }
    
            } catch  {
                print("Error Serialization json:", error )
            }
    
       }.resume()
       print("getJsonData ran")
    
    }
    

    因为dataTask异步工作。

    注意:

    请遵守结构和类名以大写字母(LaunchDataRocketInfo开头)的命名约定,并且所有名称都应该是 camelCased 而不是< EM> snake_cased

答案 1 :(得分:1)

viewDidLoad()

中删除 self.launchTableView.reloadData()

并成功获取数据

do {
            let launchDataDecoded = try JSONDecoder().decode([launchData].self, from: data)
            print(launchDataDecoded)
            self.launchTableView.reloadData()
        } catch let jsonErr {
            print("Error Serialization json:", jsonErr )
        }
    }.resume()

getJsonData()遵循异步。希望这有帮助!