如何在 Swift 中完成所有单元格数据加载之前不显示 tableView

How to not show tableView until all cell data is finished loading in Swift

我有一个 tableView,但是当它加载单元格时,它看起来很难看,因为图像需要一两秒钟才能加载。我有一个加载程序,我想显示它,然后当所有单元格加载完毕时,我想要显示 tableView 并隐藏加载器。如何判断 tableView 何时完成加载并显示 tableView?

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MainTableViewCell",
                                                 for: indexPath) as! MainTableViewCell
    let payment = self.payments[indexPath.row]
            if let profileImageUrl = payment.picture {
                cell.profilePicture.loadImageUsingCacheWithUrlString(profileImageUrl)
                cell.profilePicture.layer.cornerRadius = cell.profilePicture.frame.size.width / 2
                cell.profilePicture.clipsToBounds = true
            }

    if payment.message == "none" {
        cell.detailsLabel.text = "No Message"
    } else {
        cell.detailsLabel.text = "\"\(payment.message ?? "")\""
    }

        cell.amountLabel.textColor = UIColor.init(red: 105/255, green: 105/255, blue: 105/255, alpha: 1)
        cell.amountLabel.text = "$\(payment.amount ?? "")"
          
        return cell
    }

所以基本上你想向 warn/show 显示 Activity Indicator 你的用户等待一段时间 直到可见单元格正确加载,对吗?

您有自己的自定义加载器 (Activity Indicator),您希望在所有单元格都加载到后显示您所写的内容。

这里需要理解的一件事是 UITableView 不会 加载 所有 单元格,因为它不会那样不行。

无论您有多少项,table 视图都只会使用 tableView:cellForRowAtIndexPath: 创建 6 或 7 个可见的单元格(视情况而定)。

如果用户滚动,则上面的方法将再次调用新的 visible 单元格。

所以这意味着

the table never really finishes loading.

回答如何检测table是否完成加载可见单元格的问题,那么您可以尝试这段代码:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        if let lastVisibleIndexPath = tableView.indexPathsForVisibleRows?.last {
                if indexPath == lastVisibleIndexPath {
                    // turn off/hide your loader
                }
        }
    }