0

我正在尝试使用数组填充 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."
        }
}

当我打开 View Controller 时,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
    }
}

我不明白为什么数组的计数打印出正确的数量,这意味着其中存储了数据,但是当加载视图控制器时,它检测到数组为空。感谢您的帮助,如果问题有点不清楚,我很抱歉。

4

1 回答 1

0

将数据附加到您应该之后cartArrayupdateCart如下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 循环多次触发异步调用,您可以使用数组计数来检查是否附加了所有项目以进行重新加载以避免多次重新加载。

于 2020-06-08T18:32:16.630 回答