我正在尝试使用数组填充UITableView,但无法这样做。这是我到目前为止所拥有的。这段代码用于检索数据并将其存储在我用来填充UITableView的数组中:
func prepareForRetrieval() {
Database.database().reference().child("UserCart").child(Auth.auth().currentUser!.uid).observe(.value, with: {
(snapshot) in
for snap in snapshot.children.allObjects {
let id = snap as! DataSnapshot
self.keyArray.append(id.key)
}
self.updateCart()
})
}
func updateCart() {
for key in keyArray {
Database.database().reference().child("UserCart").child(Auth.auth().currentUser!.uid).child(key).observeSingleEvent(of: .value, with: {
(snapshot) in
let value = snapshot.value as? NSDictionary
let itemName = value?["Item Name"] as! String
let itemPrice = value?["Item Price"] as! Float
let itemQuantity = value?["Item Quantity"] as! Int
self.cartArray.append(CartData(itemName: itemName, itemQuantity: itemQuantity, itemPriceNumber: itemPrice))
print(self.cartArray.count)
})
}
}
数据已正确添加到数组中,当我打印数组的计数时,它会打印正确的计数。这意味着数据在那里。但是,当我尝试填充UITableView时,它没有检测到任何数据。我有以下代码来确保在尝试填充UITableView之前数组中有数据:
override func viewDidLoad() {
super.viewDidLoad()
cartBrain.prepareForRetrieval()
if cartBrain.cartArray.isEmpty == false{
tableViewOutlet.dataSource = self
tableViewOutlet.reloadData()
}
else {
tableViewOutlet.isHidden = true
tableViewOutlet.isUserInteractionEnabled = false
purchaseButtonOutlet.isEnabled = false
cartEmptyLabel.text = "Your cart is empty. Please add items and check back later."
}
}
当我打开视图控制器时,TableView被禁用,因为它没有检测到任何数据。我已经将数据源设置为self,问题是当打印数组的计数时,它会再次打印正确的数量。我已经将UITableView的数据源设置为self。这是我的UITableView代码:
extension CartViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return cartBrain.cartArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cartcustomcell", for: indexPath)
cell.textLabel?.text = cartBrain.cartArray[indexPath.row].itemName
cell.detailTextLabel?.text = String(cartBrain.cartArray[indexPath.row].itemQuantity)
return cell
}
}
我不明白为什么数组的计数会打印正确的数量,这意味着其中存储了数据,但是在加载View Controller时,它会检测到数组为空。感谢您的帮助,如果问题不清楚,我们深感抱歉。
将数据附加到cartArray
中的updateCart
之后,您应该reloadData()
,如下所示:
weak var tableViewOutlet: UITableView?
func updateCart() {
for key in keyArray {
Database.database().reference().child("UserCart").child(Auth.auth().currentUser!.uid).child(key).observeSingleEvent(of: .value, with: {
(snapshot) in
let value = snapshot.value as? NSDictionary
let itemName = value?["Item Name"] as! String
let itemPrice = value?["Item Price"] as! Float
let itemQuantity = value?["Item Quantity"] as! Int
self.cartArray.append(CartData(itemName: itemName, itemQuantity: itemQuantity, itemPriceNumber: itemPrice))
DispatchQueue.main.async {
self.tableViewOutlet.reloadData()
}
})
}
}
updateCart
似乎与tableViewOutlet
没有任何联系,因此您需要像这样在viewDidLoad
中传递对其的引用:
override func viewDidLoad() {
super.viewDidLoad()
cartBrain.tableViewOutlet = tableViewOutlet
cartBrain.prepareForRetrieval()
注意:由于您使用for循环多次触发异步调用,因此可以使用数组计数来检查是否所有项都已附加以进行重新加载,以避免多次重新加载。