UITableView,cellForRowAt indexPath 没有被调用

Posted

技术标签:

【中文标题】UITableView,cellForRowAt indexPath 没有被调用【英文标题】:UITableView, cellForRowAt indexPath is not being called 【发布时间】: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!
    

【问题讨论】:

【参考方案1】:

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

两大问题:

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

解决方法是删除该行

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

【讨论】:

以上是关于UITableView,cellForRowAt indexPath 没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

如何在uitableview的cellForRowAt函数中按标题日期对响应进行排序

UITableView "cellForRowAt: indexPath" 偶尔在 Core Data 属性上调用 "init?(coder aDecoder: NSCo

UiTableView cellForRowAt 没有返回好的值并且不能滚动

在 CellForRowAt 中包含用于自定义 UIView 的 nib 文件,在滚动时会产生 jerk

如何从 cellForRowAt 调用 draw(_ rect: CGRect) 在自定义 tableview 上绘图?

Swift UITableView中的渐变层