UITableView 单元格在首次加载时未显示
Posted
技术标签:
【中文标题】UITableView 单元格在首次加载时未显示【英文标题】:UITableView cells not showing on first load 【发布时间】:2020-05-17 15:59:21 【问题描述】:当我转到另一个屏幕并返回我的数据显示时,我的 TableView 单元格没有加载? 任何解决此问题的方法
我的代码:
import UIKit
import FirebaseDatabase
var mynamesArray = [String]()
class Services: UIViewController, UITableViewDelegate, UITableViewDataSource
var refHandle: UInt!
@IBOutlet var tableView: UITableView!
var videos: [String] = []
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = mynamesArray[indexPath.row]
tableView.reloadData()
return cell
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
refHandle = ref.child("Services").child("ServiceA").observe(.value, with : (snapshot) in
mynamesArray = []
for child in snapshot.children
mynamesArray.append((child as AnyObject).key)
print (mynamesArray)
)
return mynamesArray.count
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath)
if editingStyle == UITableViewCell.EditingStyle.delete
mynamesArray.remove(at: indexPath.row)
tableView.reloadData()
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
myIndex = indexPath.row
performSegue(withIdentifier: "seque", sender: self)
override func viewDidLoad()
super.viewDidLoad()
tableView.reloadData()
tableView.delegate = self
我是新手,所以我真的不知道堆栈溢出是如何工作的,如果我应该更新或添加任何内容,请告诉我:)
编辑:我忘了提这个,但我有第二个视图控制器,文本出现在其中:
import UIKit
import FirebaseDatabase
class ServicesDisplayViewController: UIViewController
let ref = Database.database().reference()
@IBOutlet var descLabel: UILabel!
@IBOutlet var titlelabel: UILabel!
override func viewDidLoad()
super.viewDidLoad()
ref.child("ServiceC").child("Title").observeSingleEvent(of: .value, with: DataSnapshot in
print(DataSnapshot) // replace this with textLabel or other item
)
titlelabel?.text = mynamesArray[myIndex]
descLabel?.text = descriptionList[myIndex]
// Do any additional setup after loading the view.
【问题讨论】:
从您的 cellForRowAt 方法中删除tableView.reloadData()
,同时确保您已设置委托和数据源
在tableView.delegate = self..之后添加tableView.dataSource = self..并把tableView.reloadData放在之后。
它们都不起作用
【参考方案1】:
您没有正确使用您的numberOfRowInSection
,并且混淆了同步和异步编程。
numberOfRowsInSection
是一种同步方法,需要“立即”返回该部分的行数。
这意味着您需要提前知道该部分中有多少个单元格。
在其中,您使用的是 firebase 方法来获取该数字,并且该方法是异步的。这意味着当您返回行数时,它将始终为 0,因为您传递给 observe
方法的代码块将仅在一段时间(发出 http 请求的时间)后执行。
您的代码中的另一个问题是您不知道 tableView 调用了多少次numberOfRowsInSection
,因此您最终可能会一遍又一遍地重新发出相同的 http 请求(也许不是现在,但在您未来的一些实施中)。
你应该找到一个地方,它可能只被调用一次,并且在显示表格视图之前调用该方法并在重新加载表格视图之前填充你的数组。
为了做到这一点,您可以在viewDidLoad
中添加处理项目数组获取的代码,然后(一旦完成)您可以重新加载表(在主线程上调度之后)。
看起来像这样:
func viewDidLoad()
super.viewDidLoad()
refHandle = ref.child("Services").child("ServiceA").observe(.value, with : (snapshot) in
mynamesArray = []
for child in snapshot.children
mynamesArray.append((child as AnyObject).key)
DispatchQueue.main.async
self.tableView.reloadData()
)
在 numberOfRowsInSection 中,您只需返回计数:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) ->
return mynamesArray.count
【讨论】:
天啊,非常感谢你,我欠你一个。我该如何回报:)以上是关于UITableView 单元格在首次加载时未显示的主要内容,如果未能解决你的问题,请参考以下文章
uitableview 自定义单元格在向下滚动 uitableview 时丢失其内容
Visual Studio 2017在首次运行时未显示编译异常
为啥我的单元格在我的 UITableView 中显示为空白?