2017-01-03 62 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 =「號任務「 返回細胞 }

.... 返回細胞 }