我仍然在tableView中收到错误,但我无法找出原因:
@objc class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var productsToDisplay: [SKProduct]!
override func viewWillAppear(_ animated: Bool) {
// an assync call to load products to the productsToDisplay
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "PurchaseItemTableViewCell", for: indexPath) as? PurchaseItemTableViewCell else {
fatalError("Coulnd't parse table cell!")
}
// here the app always show an error without any specification
if(!(self.productsToDisplay != nil && self.productsToDisplay!.count > 0)) {
return cell
}
cell.nameLabel.text = "my text"
return cell
}
}
我做错了什么?或者如何在加载数据之前修复表的错误/不加载内容?
非常感谢
答案 0 :(得分:0)
基本上永远不会永远不会将数据源数组声明为(隐式解包)可选。将其声明为非可选的空数组:
var productsToDisplay = [SKProduct]()
好处是非可选类型不会崩溃。
在numbersOfRows
中返回项目数:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return productsToDisplay.count
}
如果数组为空,则永远不会调用cellForRow
。
在cellForRow
中首先设置标签然后返回单元格并检查0并且不需要nil
:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "PurchaseItemTableViewCell", for: indexPath) as! PurchaseItemTableViewCell
let product = productsToDisplay[indexPath.row]
cell.nameLabel.text = product.name // change that to the real property in SKProduct
return cell
}
答案 1 :(得分:0)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
。
您必须实施func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
并让它返回productsToDisplay
中的元素数量。只有当您至少要显示一行时,系统才会调用cellForRowAt indexPath
。
当您的异步请求完成时,请务必在reloadData
上致电tableView
。