2017-01-03 61 views
0

我当时正在关注一些过时的YouTube教程,并在此问题上停留了3天。我正在制作一个简单的待办事宜应用程序。我想在tableView中显示数据库中所有任务的名称。Firebase Query/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细胞的名称,该应用程序崩溃,每一次和版画

"fatal error: Index out of range"

在问候了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 
} 
+1

问题通过让thisTask =任务[indexPath.row]引起的。任务中有0个元素,并且您将最小行数设置为1.因此,在访问任务[0]时,您会得到该错误。 – Dari

+1

ref.child(“Task”)正在侦听任务节点...如果您的目的是要听新的孩子添加,我认为您需要听取“任务** **”,如果这符合您的结构,并且你需要按照Nirav D的答案为tableView。 – Jad

+0

谢谢大家@Jad – user3344239

回答

2

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

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

注:在斯威夫特使用本地DictionaryArray代替NSDictionaryNSArray。在方法

+0

谢谢大家,它工作。 – user3344239

1

添加代码 “FUNC的tableView(_的tableView:UITableView的,cellForRowAt indexPath:IndexPath)”?

... 如果tasks.count == 0 { cell.textLabel的.text =“号任务“ 返回细胞 }

.... 返回细胞 }