簡體   English   中英

UITableView,cellForRowAt indexPath沒有被調用

[英]UITableView, cellForRowAt indexPath is not being called

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

首先, 永遠不要cellForRowAt調用reloadData() 刪除行

兩個主要問題:

  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 ),並且所有名稱都應為駝峰式而不是snake_cased

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()是異步的。 希望對您有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM