【问题标题】:UITableView, cellForRowAt indexPath is not being calledUITableView,cellForRowAt indexPath 没有被调用
【发布时间】:2018-03-10 15:25:35
【问题描述】:

我一直在为 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!
    }
}

【问题讨论】:

    标签: ios swift uitableview tableview


    【解决方案1】:

    首先永远不要打电话给reloadData()cellForRowAt!删除该行

    两大问题:

    1. reloadData() 调用太快了。
    2. 数据源数组接收数据后未填充。

    解决方法是删除该行

    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 而不是 snake_cased。

    【讨论】:

      【解决方案2】:

      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() 是跟随异步的。希望对您有所帮助!

      【讨论】:

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