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
异步工作。
注意:
请遵守结构和类名称以大写字母开头的命名约定(LaunchData
、RocketInfo
),并且所有名称都应该是 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 上绘图?