Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
修复iOS拉刷新动画_Ios_Swift_Uitableview_Pull To Refresh - Fatal编程技术网

修复iOS拉刷新动画

修复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

这是我的刷新控件代码。 代码已使用整个ViewController代码进行了更新,以便更好地理解

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所说,我更改了代码以使用该属性,但这并没有影响问题。我还发现了类似的问题:非常感谢您向我指出这一点,它解决了我的问题@罗伯托也感谢您的帮助和耐心。您能检查一下这个问题吗->