仍然得到错误空数组

时间:2017-03-31 15:57:38

标签: swift uitableview

我仍然在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

}

}

我做错了什么?或者如何在加载数据之前修复表的错误/不加载内容?

非常感谢

2 个答案:

答案 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