加载时在 UITableView 底部添加一个 ActivityIndicator
Add a ActivityIndicator to the bottom of UITableView while loading
我想在显示最后一个单元格时将 ActivityIndicator 添加到我的 UITableView 底部,同时我正在获取更多数据,然后在获取数据时将其隐藏。
所以我滚动到底部 -> 显示最后一行 -> 提取数据时微调器开始旋转 -> 提取数据,隐藏微调器 -> 新数据添加到 tableview。
关于如何实现这一目标的任何提示?
谢谢 ;)
一种方法是添加一个带有 UIActivityIndicatorView 的自定义单元格。你可以把它放在一个单独的部分。有很多方法可以做到这一点。
或者你看看这个:https://github.com/evnaz/ENFooterActivityIndicatorView
添加此功能
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let lastSectionIndex = tableView.numberOfSections - 1
let lastRowIndex = tableView.numberOfRows(inSection: lastSectionIndex) - 1
if indexPath.section == lastSectionIndex && indexPath.row == lastRowIndex {
// print("this is the last cell")
let spinner = UIActivityIndicatorView(activityIndicatorStyle: .gray)
spinner.startAnimating()
spinner.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.bounds.width, height: CGFloat(44))
self.tableview.tableFooterView = spinner
self.tableview.tableFooterView?.isHidden = false
}
}
并且 tableFooterView 应该在数据加载时隐藏。
Swift 5
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let lastSectionIndex = tableView.numberOfSections - 1
let lastRowIndex = tableView.numberOfRows(inSection: lastSectionIndex) - 1
if indexPath.section == lastSectionIndex && indexPath.row == lastRowIndex {
// print("this is the last cell")
let spinner = UIActivityIndicatorView(style: .medium)
spinner.startAnimating()
spinner.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.bounds.width, height: CGFloat(44))
self.tableview.tableFooterView = spinner
self.tableview.tableFooterView?.isHidden = false
}
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let total = (self.array.count )
if (indexPath.item + 1) == (self.array.count ){
self.limit = Int(self.limit+20) // table item render limit
if total < limit {
let spinner = UIActivityIndicatorView(style: .gray)
spinner.startAnimating()
spinner.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.bounds.width, height: CGFloat(44))
self.myTableView.tableFooterView = spinner
self.myTableView.tableFooterView?.isHidden = false
}
}
}
更新 2020 Swift 5,Xcode 11
我使用了@Ayaz Akbar 的解决方案,效果非常好。它只是需要一些改进。以下是我如何根据需要采用它。
如果没有更多项目要加载,则删除加载指示器
由于您在每次到达项目末尾时都添加了加载指示器,所以在某些情况下您不再向 table 视图数据源添加新项目。此时您需要移除加载指示器。我使用的是自定义 UITableViewDataSource
,每次收到新数据时都会调用其完成处理程序。我还保留了一个 var newCount
来跟踪新项目的数量。所以这是我在我的视图控制器中隐藏 activity 指示器的方法:
private lazy var dataSource: CustomTableViewDataSource = {
return CustomTableViewDataSource(query: CustomQuery) { [unowned self] (result) in
// For the initial load I needed a standard activity indicator in the center of the screen
self.stopMainActivityIndicatorIfNeeded()
switch result {
case .success(()):
if self.dataSource.newCount > 0 {
self.tableView.reloadData()
} else {
// Hide the tableFooterView, respectively the activity indicator
self.tableView.tableFooterView = nil
}
case .failure(let error):
self.showError(error)
}
}
}()
这是我更新的 UITableView
委托方法:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let lastSectionIndex = tableView.numberOfSections - 1
let lastRowIndex = tableView.numberOfRows(inSection: lastSectionIndex) - 1
if indexPath.section == lastSectionIndex && indexPath.row == lastRowIndex && dataSource.newCount > 0 {
let spinner = UIActivityIndicatorView(style: .gray)
spinner.frame = CGRect(x: 0.0, y: 0.0, width: tableView.bounds.width, height: 70)
spinner.startAnimating()
tableView.tableFooterView = spinner
}
}
您可以将子视图添加到 UITableView
并在用户滚动到底部时显示它。
我不得不在多个 UIScrollViews
上实现相同的东西,最后为它创建了一个 DSL
。
还创建了一个pod
你可以看一下源代码或者如果你想使用pod。
我想在显示最后一个单元格时将 ActivityIndicator 添加到我的 UITableView 底部,同时我正在获取更多数据,然后在获取数据时将其隐藏。
所以我滚动到底部 -> 显示最后一行 -> 提取数据时微调器开始旋转 -> 提取数据,隐藏微调器 -> 新数据添加到 tableview。
关于如何实现这一目标的任何提示?
谢谢 ;)
一种方法是添加一个带有 UIActivityIndicatorView 的自定义单元格。你可以把它放在一个单独的部分。有很多方法可以做到这一点。
或者你看看这个:https://github.com/evnaz/ENFooterActivityIndicatorView
添加此功能
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let lastSectionIndex = tableView.numberOfSections - 1
let lastRowIndex = tableView.numberOfRows(inSection: lastSectionIndex) - 1
if indexPath.section == lastSectionIndex && indexPath.row == lastRowIndex {
// print("this is the last cell")
let spinner = UIActivityIndicatorView(activityIndicatorStyle: .gray)
spinner.startAnimating()
spinner.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.bounds.width, height: CGFloat(44))
self.tableview.tableFooterView = spinner
self.tableview.tableFooterView?.isHidden = false
}
}
并且 tableFooterView 应该在数据加载时隐藏。
Swift 5
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let lastSectionIndex = tableView.numberOfSections - 1
let lastRowIndex = tableView.numberOfRows(inSection: lastSectionIndex) - 1
if indexPath.section == lastSectionIndex && indexPath.row == lastRowIndex {
// print("this is the last cell")
let spinner = UIActivityIndicatorView(style: .medium)
spinner.startAnimating()
spinner.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.bounds.width, height: CGFloat(44))
self.tableview.tableFooterView = spinner
self.tableview.tableFooterView?.isHidden = false
}
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let total = (self.array.count )
if (indexPath.item + 1) == (self.array.count ){
self.limit = Int(self.limit+20) // table item render limit
if total < limit {
let spinner = UIActivityIndicatorView(style: .gray)
spinner.startAnimating()
spinner.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.bounds.width, height: CGFloat(44))
self.myTableView.tableFooterView = spinner
self.myTableView.tableFooterView?.isHidden = false
}
}
}
更新 2020 Swift 5,Xcode 11
我使用了@Ayaz Akbar 的解决方案,效果非常好。它只是需要一些改进。以下是我如何根据需要采用它。
如果没有更多项目要加载,则删除加载指示器
由于您在每次到达项目末尾时都添加了加载指示器,所以在某些情况下您不再向 table 视图数据源添加新项目。此时您需要移除加载指示器。我使用的是自定义 UITableViewDataSource
,每次收到新数据时都会调用其完成处理程序。我还保留了一个 var newCount
来跟踪新项目的数量。所以这是我在我的视图控制器中隐藏 activity 指示器的方法:
private lazy var dataSource: CustomTableViewDataSource = {
return CustomTableViewDataSource(query: CustomQuery) { [unowned self] (result) in
// For the initial load I needed a standard activity indicator in the center of the screen
self.stopMainActivityIndicatorIfNeeded()
switch result {
case .success(()):
if self.dataSource.newCount > 0 {
self.tableView.reloadData()
} else {
// Hide the tableFooterView, respectively the activity indicator
self.tableView.tableFooterView = nil
}
case .failure(let error):
self.showError(error)
}
}
}()
这是我更新的 UITableView
委托方法:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let lastSectionIndex = tableView.numberOfSections - 1
let lastRowIndex = tableView.numberOfRows(inSection: lastSectionIndex) - 1
if indexPath.section == lastSectionIndex && indexPath.row == lastRowIndex && dataSource.newCount > 0 {
let spinner = UIActivityIndicatorView(style: .gray)
spinner.frame = CGRect(x: 0.0, y: 0.0, width: tableView.bounds.width, height: 70)
spinner.startAnimating()
tableView.tableFooterView = spinner
}
}
您可以将子视图添加到 UITableView
并在用户滚动到底部时显示它。
我不得不在多个 UIScrollViews
上实现相同的东西,最后为它创建了一个 DSL
。
还创建了一个pod
你可以看一下源代码或者如果你想使用pod。