【问题标题】:UITableView with Segmented Controller not displaying data immediately - Swift带有分段控制器的 UITableView 不立即显示数据 - Swift
【发布时间】: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()
      }
  }
}

我的问题是:

  1. 为什么没有立即加载数据?
  2. 如果数组在第一次运行时没有填充数据,它们是从哪里来的?如果该代码直接位于填充它们的代码下方,为什么它们不被排序?

【问题讨论】:

  • 调度块应该在for循环之后和})之前。它应该在observe/observeSingleEvent 内。此外,您的排序代码需要在同一个块内
  • @Mamta 效果很好!谢谢
  • @Mamta 我不能对评论进行投票,但如果您将其作为答案提交,我会的!

标签: swift tableview uisegmentedcontrol


【解决方案1】:

调度块应该在for循环之后和})之前。 它应该在observe/observeSingleEvent 内。此外,您的 sort 代码必须位于同一块内。如下:

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()
    }
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-09
    • 2021-03-31
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多