来自Firebase数据库的TableViewCell数据

时间:2016-06-29 10:55:42

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

所以基本上我想从我的数据库中获取Holes并将它们放在tableView中,但我真的不知道如何。我无法弄清楚如何让细胞获得洞的数量标题。

这是我的数据库: Structure

这是我的viewcontroller:

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
    }


}

2 个答案:

答案 0 :(得分: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]中拥有了Holes快照(每个洞的一个快照),你只需要将单元格textLabel设置为快照值。

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

答案 1 :(得分:0)

我会向您提供有关此主题的一些信息,然后尽力以这种方式与您讨论。

首先,给出以下结构:

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,因此您可以轻松地将这些孔直接读入数组“'

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

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

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

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

Firebase中的数组基于零,因此它在第一个示例中为第0个元素分配NULL。因此,#1洞真的需要成为Firebase数组中的第0个元素。

话虽如此,让我们说这是一场特殊的活动,全国#7天。所以你想把#7洞的名字更改为其他东西......说&#39;洞7,关心的洞#&#39;

使用Firebase阵列时,您必须读入并覆盖整个节点(&#39;洞&#39;节点,lol),因为您无法访问阵列中的各个元素。

更好的选择是格式化您的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阵列非常具有情境性,通常可以避免。

希望有所帮助。