【问题标题】:Firebase Query / TableView issueFirebase 查询/TableView 问题
【发布时间】:2017-01-03 08:42:34
【问题描述】:

我正在关注一些过时的 youtube 教程,并且已经在这个问题上停留了 3 天。我正在制作一个简单的待办事项应用程序。我想在 tableView 中显示数据库中所有任务的名称。

数据库是结构化的:

-Task
  -unique task ID
      -description
      -name

所以我试图获取数据库中所有任务的名称并将它们显示在 tableView 中。

这是我所拥有的:

       ref = FIRDatabase.database().reference()
       var tasks: [Task] = []
       ref.child("Task").queryOrderedByKey().observe(.childAdded, with: {  snapshot in


        let snapshotValue = snapshot.value as? NSDictionary
        let taskName = snapshotValue?["name"] as? String
        let taskDescrip = snapshotValue?["description"] as? String

        let addTask = Task()
        addTask.descrip = taskDescrip!
        addTask.name = taskName!

        self.tasks.append(addTask)

        self.tableView.reloadData()

    })

一切都按预期打印,但是当我添加代码以在 tableView 单元格中呈现名称时,应用程序每次都会崩溃并打印

“致命错误:索引超出范围”

关于tasks[indexPath.row]

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

    if tasks.count == 0 {
        return 1
    }

    return tasks.count
}


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

    if tasks.count == 0 {
        cell.textLabel?.text = "No tasks"
    }

    let thisTask = tasks[indexPath.row]
    cell.textLabel?.text = thisTask.name

    return cell
}

【问题讨论】:

  • 问题是由 let thisTask = tasks[indexPath.row] 引起的。任务中有 0 个元素,并且您将最小行数设置为 1。因此,在访问任务 [0] 时,您遇到了该错误。
  • ref.child("Task") 正在监听任务节点...如果您的目的是监听添加的新子节点,我认为您需要监听“Tasks" 如果这符合您的结构,并且您还需要遵循 Nirav D 对 tableView 的回答。
  • 谢谢你们@Jad

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


【解决方案1】:

您需要将let thisTask = tasks[indexPath.row]cell.textLabel?.text = thisTask.name 放在else 条件的else 块内,因为您的数组是空的并且它正试图从中访问第一个对象。所以应该是这样的。

if tasks.count == 0 {
    cell.textLabel?.text = "No tasks"
}
else {
    let thisTask = tasks[indexPath.row]
    cell.textLabel?.text = thisTask.name
}
return cell

注意:在 Swift 中使用原生 DictionaryArray 而不是 NSDictionaryNSArray

【讨论】:

    【解决方案2】:

    在方法“func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)”中添加代码

    ... 如果tasks.count == 0 { cell.textLabel?.text = "没有任务" 返回单元格 }

    .... 返回单元格 }

    【讨论】:

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