在Swift中填充此UITableView时,我在做什么错?

问题描述 投票:0回答:1

我正在尝试使用数组填充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时,它会检测到数组为空。感谢您的帮助,如果问题不清楚,我们深感抱歉。

ios arrays swift uitableview uitableviewdatasourceprefetching
1个回答
0
投票

将数据附加到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循环多次触发异步调用,因此可以使用数组计数来检查是否所有项都已附加以进行重新加载,以避免多次重新加载。

© www.soinside.com 2019 - 2024. All rights reserved.