*我对swift很新。
我目前正在使用Swift 4,Xcode 9和Firebase。我的目标是创建一个应用程序,将数据存储在列表中,将其显示在表视图中,并允许用户向列表中添加更多数据。我停留在显示数据部分,我创建了一个应该从数据库获取数据的函数,然后将其添加到数组中,以便我可以在自定义表视图单元格上显示它的各个部分。这是我的代码:
class OrdersPage: UIViewController, UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return orders.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "orderCell", for: indexPath) as! OrderCell
cell.setOrder(order: orders[indexPath.row])
print("Adding new cell")
return cell
}
@IBOutlet weak var tableView: UITableView!
var ref: DatabaseReference!
var orders = [Order]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
self.ref = Database.database().reference()
orders = getOrders()
}
func getOrders() -> [Order] {
var tempArray = [Order]()
ref.child("Orders").observe(.value) { (snapshot) in
for child in snapshot.children {
let orderDB = child as! DataSnapshot
let orderDict = orderDB.value as! [String: Any]
let name = orderDict["name"] as! String
let date = orderDict["date"] as! String
let time = orderDict["time"] as! String
let hotel = orderDict["hotel"] as! String
let room = orderDict["room"] as! String
let airport = orderDict["airport"] as! String
let agent = orderDict["agent"] as! String
let price = orderDict["price"] as! String
//let submitted = orderDict["submitted"] as! String
tempArray.append(Order(name: name, date: date, time: time, hotel: hotel, room: room, airport: airport, agent: agent, price: price))
}
}
return tempArray
}
根据我的测试,问题是在调用numberOfRowsInSection时,orders数组不包含任何内容,因此它不会在表视图中创建任何单元格。我不确定为什么它不能正常工作并且已经坚持了很长一段时间了,任何帮助都会受到赞赏。
答案 0 :(得分:1)
getOrders()
是异步调用,因此您需要在从服务器获取数据后重新加载表。
这是你实现这一目标的方式。
替换:
func getOrders() -> [Order]
带
func getOrders()
您的getOrders
方法将如下所示:
func getOrders() {
ref.child("Orders").observe(.value) { (snapshot) in
for child in snapshot.children {
let orderDB = child as! DataSnapshot
let orderDict = orderDB.value as! [String: Any]
let name = orderDict["name"] as! String
let date = orderDict["date"] as! String
let time = orderDict["time"] as! String
let hotel = orderDict["hotel"] as! String
let room = orderDict["room"] as! String
let airport = orderDict["airport"] as! String
let agent = orderDict["agent"] as! String
let price = orderDict["price"] as! String
//let submitted = orderDict["submitted"] as! String
//Add your data into array
self.orders.append(Order(name: name, date: date, time: time, hotel: hotel, room: room, airport: airport, agent: agent, price: price))
}
//Reload your tableView here
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
我更新了内部代码。检查评论。
现在使用viewDidLoad
方法替换:
orders = getOrders()
使用
getOrders()
答案 1 :(得分:0)
您可以在定义didSet
变量时使用self.orders
来重新加载UITableView
当您将任何数据分配到self.orders
替换你的声明
var orders = [Order]()
以下代码
var orders : [Order] = [] {
didSet {
tableView.reloadData()
}
}