Firebase的TableView中未显示数据

时间:2019-05-18 13:05:43

标签: swift firebase uitableview firebase-realtime-database

在Firebase的表格中显示数据时,我遇到2个问题。

  1. Firebase的TableView中没有显示任何内容
  2. 我无法将链接(子级)添加到变量

打印正常。我可以访问Firebase,但是没有任何内容添加到TableView。请查看我的代码并更正我错的地方。

这是我的模特

class Exercises {

    var titleExercise = ""
    var descriptionExercise = ""

    init (titleExercise: String, descriptionExercise: String) {

        self.titleExercise = titleExercise
        self.descriptionExercise = descriptionExercise
    }
}

这是我的ViewController

class ExercisesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {




    //MARK: Properties
    var refWorkout: String = ""
    var workout: TrainingProgram?
    var ref: DatabaseReference!


    @IBOutlet weak var tableView: UITableView!
    var exercises = [Exercises]()


    //MARK: Methods
    override func viewDidLoad() {
        super.viewDidLoad()

        fetchExercises()
        tableView.dataSource = self
        tableView.delegate = self

        refWorkout = workout!.title





    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return exercises.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as!  ExercisesTableViewCell

        let workouts = exercises[indexPath.item]
        cell.titleLabel.text = workouts.titleExercise
        cell.descriptionLabel.text = workouts.descriptionExercise

        return cell
    }

    func fetchExercises() {
        Database.database().reference().child("programs").child("OPEN SPACE").child("exercises").observe(.childAdded) { (snapshot) in
            print(snapshot.value)
            if let dict = snapshot.value as? [String: AnyObject] {
                let newTitle = dict["title"] as! String
                let newDescription = dict["description"] as! String
                let exerciseTableCell = Exercises(titleExercise: newTitle, descriptionExercise: newDescription)

            }
        }
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }


    }


}

我还有第二个问题。它还解决了这个问题。 如您所见,我有refWorkout = workout!.title,这是以前的ViewController的标题,而refWorkout是Firebase的子级。如果我要编写下一个代码

ref = Database.database().reference().child("programs").child(refWorkout).child("exercises")

   ref.observe(.childAdded) { (snapshot) in
       print(snapshot.value)
   }

一切都会正常。打印即可。但是,如果我将这段代码插入func fetchExercises()->看起来像

func fetchExercises() {
        Database.database().reference().child("programs").child(refWorkout).child("exercises").observe(.childAdded)...

我的应用崩溃了。 请帮我两个问题。谢谢!

我的Firebase结构image

1 个答案:

答案 0 :(得分:1)

这是一个常见的错误,您太早重新加载了表格视图,并且没有将结果分配/附加到数据源数组中

observe API异步工作,将重新加载表格视图的行放入闭包中

func fetchExercises() {
    Database.database().reference().child("programs").child("OPEN SPACE").child("exercises").observe(.childAdded) { (snapshot) in
        print(snapshot.value)
        if let dict = snapshot.value as? [String: Any] { // most likely all values are value type
            let newTitle = dict["title"] as! String
            let newDescription = dict["description"] as! String
            let exercise = Exercises(titleExercise: newTitle, descriptionExercise: newDescription)
            self.exercises.append(exercise)

        }
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }
}

旁注:

您的课程包含3个不良做法:

  1. 集合类型中使用的对象在语义上应以单数形式命名。
  2. 如果有初始化程序,请不要使用默认值声明属性。
  3. 变量名称中有太多冗余信息

在大多数情况下,一个结构甚至常量就足够了。我建议

struct Exercise {
    let title : String
    let description : String
}

在结构中,您可以免费获得初始化程序。