如何在 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
}
}
}
我有一个 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
}
}
}