到达 UITableView 底部后加载更多
Load More After Coming to Bottom of UITableView
对于我的应用,我使用的是 "load more at bottom" 属性,如下所示。实际上效果很好;唯一的问题是,当用户到达按钮时,虽然加载更多功能正在运行,但对用户来说,应用程序似乎冻结了一段时间,因为没有像 UIRefreshcontrol
中那样的动画视图。在加载新数据之前如何显示动画。我发现一些 UIBottomrefreshcontrol
属性作为单独的库,但它们都在 Objective-c.
中
override func viewDidLoad() {
super.viewDidLoad()
refreshResults()
}
func refreshResults() {
refreshPage = 40
// here the query starts
}
func refreshResults2() {
// here the query starts to add new 40 rows of data to arrays
}
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if indexPath.row == refreshPage-1 {
refreshPage = refreshPage + 40
refreshResults2()
}
}
向您的 UITableViewController 添加一个 UIActivityIndicatorView
(即微调器)。将插座连接到代码:
@IBOutlet weak var spinner: UIActivityIndicatorView!
将 属性 添加到您的 UITableViewController
以跟踪您当前正在加载更多数据,这样您就不会尝试加载两次:
var loadingData = false
启动微调器动画,然后调用 refreshResults2()
:
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if !loadingData && indexPath.row == refreshPage - 1 {
spinner.startAnimating()
loadingData = true
refreshResults2()
}
}
在后台线程上有 refreshResults2()
运行。这将使您的 table 仍然可以自由移动。动画微调器将告诉用户更多数据即将到来。查询 returns 后,更新主线程上的 table 数据。
func refreshResults2() {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
// this runs on the background queue
// here the query starts to add new 40 rows of data to arrays
dispatch_async(dispatch_get_main_queue()) {
// this runs on the main queue
self.refreshPage += 40
self.tableView.reloadData()
self.spinner.stopAnimating()
self.loadingData = false
}
}
}
Swift 3 , Xcode 8
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let lastElement = dataSource.count - 1
if !loadingData && indexPath.row == lastElement {
spinner.startAnimating()
loadingData = true
loadMoreData()
}
}
根据 swift 中的@vacawama 异步调用 3:-
func loadMoreData() {
DispatchQueue.global(qos: .background).async {
// this runs on the background queue
// here the query starts to add new 10 rows of data to arrays
DispatchQueue.main.async {
// this runs on the main queue
self.spinner.stopAnimating()
self.loadingData = false
}
}
}
对于我的应用,我使用的是 "load more at bottom" 属性,如下所示。实际上效果很好;唯一的问题是,当用户到达按钮时,虽然加载更多功能正在运行,但对用户来说,应用程序似乎冻结了一段时间,因为没有像 UIRefreshcontrol
中那样的动画视图。在加载新数据之前如何显示动画。我发现一些 UIBottomrefreshcontrol
属性作为单独的库,但它们都在 Objective-c.
override func viewDidLoad() {
super.viewDidLoad()
refreshResults()
}
func refreshResults() {
refreshPage = 40
// here the query starts
}
func refreshResults2() {
// here the query starts to add new 40 rows of data to arrays
}
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if indexPath.row == refreshPage-1 {
refreshPage = refreshPage + 40
refreshResults2()
}
}
向您的 UITableViewController 添加一个 UIActivityIndicatorView
(即微调器)。将插座连接到代码:
@IBOutlet weak var spinner: UIActivityIndicatorView!
将 属性 添加到您的 UITableViewController
以跟踪您当前正在加载更多数据,这样您就不会尝试加载两次:
var loadingData = false
启动微调器动画,然后调用 refreshResults2()
:
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if !loadingData && indexPath.row == refreshPage - 1 {
spinner.startAnimating()
loadingData = true
refreshResults2()
}
}
在后台线程上有 refreshResults2()
运行。这将使您的 table 仍然可以自由移动。动画微调器将告诉用户更多数据即将到来。查询 returns 后,更新主线程上的 table 数据。
func refreshResults2() {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
// this runs on the background queue
// here the query starts to add new 40 rows of data to arrays
dispatch_async(dispatch_get_main_queue()) {
// this runs on the main queue
self.refreshPage += 40
self.tableView.reloadData()
self.spinner.stopAnimating()
self.loadingData = false
}
}
}
Swift 3 , Xcode 8
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let lastElement = dataSource.count - 1
if !loadingData && indexPath.row == lastElement {
spinner.startAnimating()
loadingData = true
loadMoreData()
}
}
根据 swift 中的@vacawama 异步调用 3:-
func loadMoreData() {
DispatchQueue.global(qos: .background).async {
// this runs on the background queue
// here the query starts to add new 10 rows of data to arrays
DispatchQueue.main.async {
// this runs on the main queue
self.spinner.stopAnimating()
self.loadingData = false
}
}
}