【发布时间】:2018-03-28 22:30:45
【问题描述】:
我有一个标签栏控制器,它的两个视图之一是 TableViewController。 TableViewController 在表格顶部有一个 SegmentedControl 栏,用于在从 Firebase 提取的两个数据集之间切换。
当我运行应用程序时,表格不会立即显示任何数据,只有当我切换到 SegmentControl 栏的另一段时。但是,当我切换回来时,会加载第一段的数据。
我设置了一个断点来查看发生了什么,它跳过了我为从 Firebase 提取数据而编写的代码,因此数组在初始加载时为空,因此缺少数据。然而,当我将段切换到另一个选项时,数据就会出现。
我也在尝试对数组中的数据进行排序,但这根本不会做任何事情,因为它会在数组返回为空时运行,所以没有什么要排序的。
我的代码是:
class LeaderboardViewController: UITableViewController
{
@IBOutlet weak var segmentedControl: UISegmentedControl!
@IBOutlet var leaderboardTable: UITableView!
var countyRef = Database.database().reference().child("countyleaderboard")
var schoolRef = Database.database().reference().child("schoolleaderboard")
var refHandle: UInt!
var countyList = [County]()
var schoolList = [School]()
override func viewDidLoad()
{
super.viewDidLoad()
fetchData()
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
var sectionCount = 0
switch(segmentedControl.selectedSegmentIndex)
{
case 0:
sectionCount = countyList.count
break
case 1:
sectionCount = schoolList.count
break
default:
break
}
return sectionCount
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let boardCell = tableView.dequeueReusableCell(withIdentifier: "boardCell", for: indexPath)
switch(segmentedControl.selectedSegmentIndex)
{
case 0:
boardCell.textLabel!.text = "" + countyList[indexPath.row].name! + ": \(countyList[indexPath.row].score!)"
break
case 1:
boardCell.textLabel!.text = "" + schoolList[indexPath.row].name! + ": \(schoolList[indexPath.row].score!)"
break
default:
break
}
return boardCell
}
func fetchData()
{
schoolRef.observe(.childAdded, with:
{ snapshot in
if let dictionary = snapshot.value as? [String: AnyObject]
{
let school = School()
school.name = dictionary["name"] as! String
school.score = dictionary["score"] as! Float
self.schoolList.append(school)
}
}, withCancel: nil)
self.schoolList.sort(by: { $0.score > $1.score })
countyRef.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children
{
let snap = child as! DataSnapshot
let county = County()
county.name = snap.key as String
county.score = snap.value as! Float
self.countyList.append(county)
}
})
self.countyList.sort(by: { $0.score > $1.score })
DispatchQueue.main.async
{
self.leaderboardTable.reloadData()
}
}
@IBAction func segmentedControlChanged(_ sender: Any)
{
DispatchQueue.main.async
{
self.leaderboardTable.reloadData()
}
}
}
我的问题是:
- 为什么没有立即加载数据?
- 如果数组在第一次运行时没有填充数据,它们是从哪里来的?如果该代码直接位于填充它们的代码下方,为什么它们不被排序?
【问题讨论】:
-
调度块应该在for循环之后和
})之前。它应该在observe/observeSingleEvent内。此外,您的排序代码需要在同一个块内 -
@Mamta 效果很好!谢谢
-
@Mamta 我不能对评论进行投票,但如果您将其作为答案提交,我会的!
标签: swift tableview uisegmentedcontrol