Swift:tableView.reloadData()表中没有数据

时间:2018-07-09 15:10:52

标签: swift tableview reloaddata

我在表中的reloadData()有麻烦。 我已经设置了表和单元格,并添加了表,甚至为该单元格创建了单独的类,以防出现问题。 我只是无法将任何数据加载到表中.....我已经在这里和其他站点上阅读了问题,但是没有一种解决方案能给我解决方案... 我看到它也是一个错误,但是它在另一个项目中工作,因此不是我的Xcode版本。 我曾尝试在cellForRowAt内部的viewDidLoad中加载,并且还使用Dispatch将其放在函数内部和外部的主线程上。我也无奈地尝试了一个按钮,但还是没有运气。这是我的代码,如果您发现我想念的任何东西,请感谢我的帮助。

//
//  VCRoster.swift
//  MC
//
//  Created by James McAdam on 08/07/2018.
//  Copyright © 2018 James McAdam. All rights reserved.
//

import UIKit

class VCRoster: UIViewController, UITableViewDelegate, UITableViewDataSource {

var tableViewData: [Roster] = []

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return tableViewData.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = rosterTable.dequeueReusableCell(withIdentifier: "rosterCell") as? rosterCell

    cell!.dateLbl.text = tableViewData[indexPath.row].date
    //Have also tried ? with the cell
    cell!.messageLbl.text = tableViewData[indexPath.row].message

    tableView.reloadData()
   return cell!
}


@IBOutlet weak var rosterTable: UITableView!

@IBAction func load(_ sender: UIBarButtonItem) {
      self.rosterTable.reloadData()
}


override func viewDidLoad() {
    super.viewDidLoad()

 //   dispatchMain().async {
 //       self.rosterTable.reloadData()
 //   }

     // self.rosterTable.reloadData()

    getDataFromServer(for: "Bx7faf08A9fYJ7bZCNMUX9EzxYN2") { (result) in
        // Check our result
        switch result {
        case .success(let results):
          //  print("Done")
            self.tableViewData = results.data
            //self.tablewView.reloadData()
            //self.rosterTable.reloadData()
        //    print(results)
        case .failure(let message):
        //    print("Error")
            print(message)
        }
    }

}


}

2 个答案:

答案 0 :(得分:2)

首先从不,从不,从不呼叫reloadData()中的cellForRow

  • 确保表视图的数据源(和委托)已连接到Interface Builder中的视图控制器
  • 删除tableView.reloadData()中的cellForRow
  • reloadData()的完成处理程序中的主线程上调用viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()

    getDataFromServer(for: "Bx7faf08A9fYJ7bZCNMUX9EzxYN2") { (result) in
        // Check our result
        switch result {
        case .success(let results):
            self.tableViewData = results.data
            DispatchQueue.main.async {
                self.rosterTable.reloadData()
            }

        case .failure(let message):
            print(message)
        }
    }

}

答案 1 :(得分:0)

首先,在这种情况下,您必须设置多个部分,一个部分包含行数,然后必须为tableView设置委托和数据源,因为您使用的是xib或Storyboard,只需从那里签名或通过编程方式

rosterTable.delegate = self
rosterTable.dataSource = self

确保您的服务器使用正确的数据进行响应并通过以下方式提取

var tableViewData: [Roster] = [] {
 didSet {
  rosterTable.reloadData()
 }
}

不要在渲染单元格时使用reloadData