修复iOS拉刷新动画
这是我的刷新控件代码。 代码已使用整个ViewController代码进行了更新,以便更好地理解修复iOS拉刷新动画,ios,swift,uitableview,pull-to-refresh,Ios,Swift,Uitableview,Pull To Refresh,这是我的刷新控件代码。 代码已使用整个ViewController代码进行了更新,以便更好地理解 import UIKit class AirportTableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, AirportRequestDelegate { @IBOutlet weak var airportTable: UITableView! var airpor
import UIKit
class AirportTableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, AirportRequestDelegate {
@IBOutlet weak var airportTable: UITableView!
var airportRequest = AirportRequest()
var airportList = [AirportDetail]()
var refreshControl = UIRefreshControl()
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Airport List"
airportTable.delegate = self
airportRequest.delegate = self
airportRequest.fetchAirports()
airportTable.dataSource = self
refreshControl.addTarget(self, action: #selector(refresh), for: UIControl.Event.valueChanged)
airportTable.addSubview(refreshControl)
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return airportList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let myCell = airportTable.dequeueReusableCell(withIdentifier: "airportTableCell", for: indexPath)
myCell.textLabel?.text = self.airportList[indexPath.row].AirportName
myCell.detailTextLabel?.text = self.airportList[indexPath.row].StationName
myCell.accessoryType = .disclosureIndicator
return myCell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.airportTable.deselectRow(at: indexPath, animated: true)
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
self.airportList.remove(at: indexPath.row)
airportTable.deleteRows(at: [indexPath], with: .top)
}
}
// The AirportRequestDelegate adds this function and is called once airport list is fetched
func didUpdateAirports(_ airportRequest: AirportRequest, airports: [AirportDetail]) {
// copies the airport list to a local variable so that it can be used with the tableView delegate functions
self.airportList = airports
// updating the UI
DispatchQueue.main.async {
self.airportTable.reloadData()
self.refreshControl.endRefreshing()
}
}
@objc func refresh(sender: UIRefreshControl) {
airportRequest.fetchAirports()
}
}
在下图中,您可以看到动画未按预期工作。我该如何解决这个问题。最好我希望动画继续,直到tableView被更新
在调用fetchAirports后,您将立即结束动画,我假定这是一个异步网络请求或是需要延迟才能完成的事情 如果要等待机场被提取并更新表,请向该函数添加完成闭包。诸如此类: funcfetchAirports@escaping完成:->无效{ //执行网络请求,完成后,呼叫完成 网络请求{ 完成 } } 然后在刷新方法中: @objc func refreshsender:UIRefreshControl{ airportRequest.fetchAirportscompletion:{[weak self]位于 self?.sender.end刷新 } }
在调用fetchAirports后,您将立即结束动画,我假定这是一个异步网络请求或是需要延迟才能完成的事情 如果要等待机场被提取并更新表,请向该函数添加完成闭包。诸如此类: funcfetchAirports@escaping完成:->无效{ //执行网络请求,完成后,呼叫完成 网络请求{ 完成 } } 然后在刷新方法中: @objc func refreshsender:UIRefreshControl{ airportRequest.fetchAirportscompletion:{[weak self]位于 self?.sender.end刷新 } } 试试看
@objc func refresh(sender: UIRefreshControl) {
refreshControl.beginRefreshing()
airportRequest.fetchAirports(completion: { [weak self] in
self?.tableView?.reloadData()
refreshControl?.endRefreshing()
})
}
试试看
@objc func refresh(sender: UIRefreshControl) {
refreshControl.beginRefreshing()
airportRequest.fetchAirports(completion: { [weak self] in
self?.tableView?.reloadData()
refreshControl?.endRefreshing()
})
}
在向表中插入新数据后,可以调用此方法
refreshControl.endRefreshing()
在向表中插入新数据后,可以调用此方法
refreshControl.endRefreshing()
将刷新控件添加为子视图可能会出现问题。UITableView现在具有刷新控件的属性。在这里,您可以从apple文档中了解如何实现该功能:
将刷新控件添加为子视图可能会出现问题。UITableView现在具有刷新控件的属性。在这里,您可以从apple文档中了解如何实现该功能:
在DidUpdateAirport中放置一个断点,并查看从何处和何时调用它。只有在调用endRefreshing后,动画才会停止 可能数据没有变化,所以可能您得到了一个缓存响应,这将导致一个非常快速的EndRefresh调用
您还可以放入一个简单的打印结束动画now语句,以实时查看它的发生。在DidUpdateAirport中放置一个断点,并查看从何处和何时调用它。只有在调用endRefreshing后,动画才会停止 可能数据没有变化,所以可能您得到了一个缓存响应,这将导致一个非常快速的EndRefresh调用
您还可以放入一个简单的打印结束动画now语句,以实时查看它的发生。我有一个委托函数,该函数在fetchAirports函数完成后调用。委托函数更新了tableView,之后我添加了EndRefresh函数,但这也没有解决问题。你确定EndRefresh函数在重新加载tableView之后才被调用吗?是的,我已经确定了。在任何情况下,我都会用完整的代码更新我的问题,以便您有更好的想法。我有一个委托函数,它在fetchAirports函数完成后调用。委托函数更新了tableView,之后我添加了EndRefresh函数,但这也没有解决问题。你确定EndRefresh函数在重新加载tableView之后才被调用吗?是的,我已经确定了。在任何情况下,我都会用完整的代码更新我的问题,以便您有更好的想法。您是否可以添加执行请求的函数,然后调用委托didUpdateAirports?下面是一个完整项目的公共github存储库的示例,而不是用大量代码混乱问题。我相信你能重现这个问题。感谢您的帮助。您是否可以添加执行请求的函数,然后调用代理didUpdateAirports?下面是一个完整项目的公共github存储库的示例,而不是将问题与大量代码混为一谈。我相信你能重现这个问题。谢谢你的帮助。我不认为这会导致问题中描述的问题。虽然使用tableView的refreshControl属性确实是更好的做法,但我在项目中使用addSubview没有任何问题,但我现在就开始使用该属性。感谢您的更新,但正如Roberto所说,我更改了代码以使用该属性,但这并没有影响问题。我还发现了类似的问题:非常感谢您向我指出这一点,它
解决了我的问题@罗伯托也感谢你的帮助和耐心。你能检查一下这个问题吗->我不认为这是问题中描述的问题的原因。虽然使用tableView的refreshControl属性确实是更好的做法,但我在项目中使用addSubview没有任何问题,但我现在就开始使用该属性。感谢您的更新,但正如Roberto所说,我更改了代码以使用该属性,但这并没有影响问题。我还发现了类似的问题:非常感谢您向我指出这一点,它解决了我的问题@罗伯托也感谢您的帮助和耐心。您能检查一下这个问题吗->