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

Posted

技术标签:

【中文标题】Swift:tableView.reloadData() 表中没有数据【英文标题】:Swift: tableView.reloadData() no data in table 【发布时间】:2018-07-09 15:10:52 【问题描述】:

我的表中的 reloadData() 有问题。 我已经设置了表格和单元格,并添加了表格,甚至为单元格创建了一个单独的类,以防这是问题所在。 我只是无法将任何数据加载到表中......我已经阅读了here和其他网站上的问题,但没有一个解决方案能给我解决方案...... 我看到它也是一个错误,但它在不同的项目中工作,所以它不是我的 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)
        
    





【问题讨论】:

你的视图控制器是否设置为tableview的数据源? 不要在tableView(_ tableView: cellForRowAt:) 中调用tableView.reloadData()getDataFromServer() 是否在主线程中关闭?你需要在那里打电话给reloadData() 是的,也是委托。 getDataFromServer() 在 vi​​ewDidLoad 中。我已经在 cellForRow 中重新加载,因为它是最后一次。在问这个问题之前我又试了一次。 请编辑您的代码以反映我们可以重现的内容。 (或者至少,注释掉你尝试过但知道不起作用的东西。我赞成一个解决cellForRowAt 尝试的答案。我不应该 - 还 - 因为那不是问题。)现在,解决您的实际问题?可以假设问题不在于 getDataFromServer 被异步调用,而是实际上返回数据 - 没有发生错误 - 并且您在 (a) result == .success 和 (b) let results 之后尝试了 reloadData 包含你试过reloadData的东西吗? ? 【参考方案1】:

首先从不,从不,从不致电reloadData()cellForRow

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


【讨论】:

result 会返回什么东西吗? 那么代码应该可以工作。重新检查表视图和数据源的连接 self.tableViewData = results.data 也应该在对DispatchQueue.main.async 的调用中。 @rmaddy 不一定。数据源数组与 UI 没有直接关系。 其实是直接相关的,因为表的重载是基于数据源的状态。想象一下表格正在滚动(当然是在主队列上)。该表需要数据的当前状态。如果在后台修改数据源的状态以准备重新加载表,事情可能会变糟。有一个短暂的时期,数据源和 UI 的状态现在不同步。我发现确保在主队列上进行数据源的更改以及更新视图的调用会更安全。【参考方案2】:

首先,您必须在您的情况下设置多个部分,其中一个部分包含行数,然后您必须为 tableView 设置委托和数据源,因为您使用的是 xib 或情节提要,只需从那里签名即可或以编程方式

rosterTable.delegate = self
rosterTable.dataSource = self

确保您的服务器以正确的数据响应并通过

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

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

【讨论】:

以上是关于Swift:tableView.reloadData() 表中没有数据的主要内容,如果未能解决你的问题,请参考以下文章

Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift

swift 示例BS swift.swift

swift swift_bug.swift

ios 整理(一)swift和oc的区别

swift swift_extension5.swift

swift swift_optional4.swift