【问题标题】:TableViewCell Data from Firebase DatabaseFirebase 数据库中的 TableViewCell 数据
【发布时间】:2016-11-01 00:58:38
【问题描述】:

所以基本上我想从我的数据库中获取孔并将它们放在 tableView 中,但我真的不知道如何。我不知道如何让单元格获得孔号的标题。

这是我的数据库:

这是我的视图控制器:

import UIKit
import Firebase

class HolesViewController: UITableViewController {


    //FirebaseRefrences
    var ref = FIRDatabaseReference.init()

    var holes: [FIRDataSnapshot]! = []

    override func viewDidLoad() {

        //ViewDidLoad


        //Refrences to Firebase

        ref = FIRDatabase.database().reference()
        let CoursesRef = ref.child("Courses")


        //snapshot

        CoursesRef.observeEventType(.ChildAdded, withBlock: { snapshpt in



            self.holes.append(snapshpt)



            self.tableView.reloadData()

        })


    }

    override func viewDidAppear(animated: Bool) {

        //ViewDidAppear
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return self.holes.count

    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell: UITableViewCell! = self.tableView.dequeueReusableCellWithIdentifier("HoleCell")

        let holesSnap = self.holes[indexPath.row]

        /*

         ??????

        */
        return cell
    }

    override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {

        return true
    }


}

【问题讨论】:

    标签: ios swift uitableview firebase firebase-realtime-database


    【解决方案1】:

    我可以看到您的 holes 数组实际上是一个课程快照数组。

    如果你想要一个包含所有课程的所有洞的数组,你需要使用以下内容

    self.holes = snapshpt.childSnapshotForPath("Holes").children.allObjects as [FIRDataSnapshot]
    

    如果您只想获取特定课程的漏洞,您应该像这样检索您的数据

    ref.child("Courses").child(courseId).child("Holes").observeEventType(.ChildAdded withBlock: { snapshot in
       self.holes.append(snapshot)
    }
    

    当您在holes[indexPath.row] 中拥有孔快照(每个孔一个快照)时,您只需将单元格textLabel 设置为快照值。

    cell.textLabel = holes[indexPath.row].value as! String
    

    【讨论】:

    • 天哪,太感谢了...一切正常,但不知何故我有一个空的顶部单元格?
    • @LB16 不错!我刚刚做了一个更新,它可能与此有关。如果没有,请花点时间调试holes 数组,看看是否有额外的快照。
    • @LB16 让我知道您是否取得了任何进展或仍有任何问题。 :)
    【解决方案2】:

    我会给你一些关于这个话题的信息,然后尽我所能说服你不要这样做。

    首先,给定以下结构:

    courses
       course_01
         holes
          1: hole 1
          2: hole 2
          3: hole 3
         name: course name 1
       course_02
         holes
          0: hole 0
          1: hole 1
          2: hole 2
         name: course name 2
    

    以及一些用于读取数据的 Firebase 代码

        self.myRootRef.childByAppendingPath("courses/course_01")
    
        thisCourseRef.observeSingleEventOfType(.Value, withBlock: { snapshot in
    
             let name = snapshot.value["name"] as! String
             let holes = snapshot.value["holes"] as! NSArray
             print(name)
             print(holes)
        })
    

    首先要注意的是,Firebase 直接支持 NSArray,因此您可以轻松地将孔直接读入数组 'holes'

    为 course_01 运行代码时,这些是结果

    course name 1
    (
        "<null>",
        "hole 1",
        "hole 2",
        "hole 3"
    )
    

    然后当我们为 course_02 运行它时...

    course name 2
    (
        "hole 0",
        "hole 1",
        "hole 2"
    )
    

    Firebase 中的数组是从零开始的,因此它在第一个示例中将 NULL 分配给第 0 个元素。因此,第 1 孔确实需要成为 Firebase 数组中的第 0 个元素。

    话虽如此,让我们说有一个特殊的事件,全国 #7 日。所以你想把第 7 洞的名字改成别的名字……说“第 7 洞,关心的洞”

    使用 Firebase 数组,您必须读取并覆盖整个节点(“洞”节点,哈哈),因为您无法访问数组中的单个元素。

    更好的选择是这样格式化您的 Firebase 结构:

    holes
      -Y9989jaik9
         name: hole 0
         hole_num: 0
      -Juiijaie898
         name: hole 1
         hole_num: 1
      .
      .
      .
      -Ykmi9mms9889
         name: Hole 7, the hole that cares
         hole_num: 7
    

    真正酷的是您可以即时重命名孔洞,而无需编辑或更新其他孔洞中的数据。

    底线是 Firebase 阵列的情况非常多,通常可以避免。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      相关资源
      最近更新 更多