这可能看起来很复杂,但我想它实际上非常简单。
我正在尝试将我在Firebase中的日期传递给我的VC中的tableviewCell
这是我的数据库结构
"2016-10-24 MON" : {
"types" : {
"LUNCH" : {
"TypeA" : "2", //the amount
"TypeB" : "1",
"TypeC" : "1"
},
"DINNER" : {
"TypeA" : "1",
"TypeB" : "2",
"TypeC" : "3"
}
}
}
"2016-10-26 WED" : {
"types" : {
"LUNCH" : {
"TypeA" : "0",
"TypeB" : "2",
"TypeC" : "3"
},
"DINNER" : {
"TypeA" : "2",
"TypeB" : "2"
}
}
这是我的代码
class orderDetail: UIViewController, UITableViewDelegate, UITableViewDataSource{
var theARRAY : [(DATES: String, TimeDeliv: String, AmountA:String, AmountB: String, AmountC: String)] = []
override func viewDidLoad() {
theREF.observeSingleEvent(of: .value, with: { (snapshot) in
//theREF is my Firebase Reference
if let Date = snapshot.value as? [String:AnyObject]{
for each in Date {
let orderdate = each.0 as! String
theREF.child(orderdate).observe(.value, with: { (snapshot) in
if snapshot.hasChild("LUNCH") {
theREF.child(orderdate).child("LUNCH").observe(.value, with: {(snapshot) in
if let snapDict = snapshot.value as? Dictionary <String, AnyObject> {
let Num1 = snapDict["TypeA"] as? String
let Num2 = snapDict["TypeB"] as? String
let Num3 = snapDict["typeC"] as? String
self.theARRAY.append((DATES: "\(orderdate)", TimeDeliv:"LUNCH", AmountA:"TypeA \(Num1)", AmountB:"TypeB \(Num2)", AmountC :"TypeC \(Num3)"))
}
})
print("LUNCH works \(snapshot)")
} else {
print ("NONE")
}
})
}
}
}
)
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return theARRAY.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "DetailCell") as! detailCell!
cell?.detailMealTypeA.text = theARRAY.AmountA
cell?.detailMealtypeB.text = theARRAY.AmountB
cell?.detailMealtypeC.text = theARRAY.AmountC
// these are from UItableViewCell file
return cell!
}
我想要做的是我想将数据库中的详细信息附加到theARRAY
,然后在tableViewCell中添加它们,但我会在0
和numberOfRowsInSection
中获得nil
在cellForRowAt
函数中。
我认为这是因为我在错误的行上致电theARRAY.append
。
有人可以帮助我吗?
请顺便原谅我讨厌的代码。
答案 0 :(得分:2)
调用viewDidLoad
后,您的桌面视图会立即配置,而无需等待Firebase呼叫完成。
检索完数据后,您需要反映这些更改并更新UI线程。在for循环外添加以下行。
DispatchQueue.main.async
{
self.tableView.reloadData()
}