【问题标题】:Pull to refresh and activity indicator on a view拉动以刷新视图上的活动指示器
【发布时间】:2019-11-12 08:52:14
【问题描述】:

我有一个包含表格视图的 VC。我已经实现了拉动以刷新表格视图和视图上的活动指示器。拉动刷新表格视图时闪烁,因为它看起来已经完成刷新并重新加载,而我拉下并继续按住表格视图。我不确定哪里出了问题。以下是我的代码。如何正确实现?

class MyViewController: CustomVC {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.addRefreshControl(to: tableView)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)

        self.view.activityStartAnimating()
        self.tableView.isHidden = true
        loadContent(isRefresh: false)
    }

    private func loadContent(isRefresh: Bool) {

         fetchContent() { (result, error) in

            // ....
            if isRefresh {
                self.refreshControl.endRefreshing()
            } else {
                self.view.activityStopAnimating()
            }

            // ...
            self.tableView.reloadData()
            self.tableView.isHidden = false
        }
    }

    // Pull to refresh
    override func fetchDataForRefresh() {
        loadContent(isRefresh: true)
    }
}

自定义 VC 类

class CustomVC: UIViewController {

    lazy var refreshControl: UIRefreshControl = {
       let refreshControl = UIRefreshControl()
        refreshControl.addTarget(self, action: #selector(refresh(_:)), for: UIControl.Event.valueChanged)
        refreshControl.transform = CGAffineTransform(scaleX: 0.87, y: 0.87)
        return refreshControl
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func addRefreshControl(to tableView: UITableView) {
        if #available(iOS 10.0, *) {
            tableView.refreshControl = refreshControl
        } else {
            tableView.addSubview(refreshControl)
        }

        tableView.indicatorStyle = .white
    }

    @objc func refresh(_ refreshControl: UIRefreshControl) {
        fetchDataForRefresh()
    }

    func fetchDataForRefresh() {
    }
}

获取内容

func fetchContent() {
    // .....
    DispatchQueue.main.async {
        completed(resultData,nil)
        return
    }
    //....
}

【问题讨论】:

    标签: ios swift uitableview pull-to-refresh activity-indicator


    【解决方案1】:

    试试这个技巧

     func setupRefreshControl() {
        refreshControl = UIRefreshControl()
        refreshControl?.addTarget(self, action: #selector(refreshData), for: .valueChanged)
        tableView?.refreshControl = refreshControl
    }
    

    当您完成获取数据时:

    DispatchQueue.main.async {   
    self.refreshControl?.perform(#selector(UIRefreshControl.endRefreshing), with: nil, afterDelay: 0)
    self.tableView.reloadData()
    }
    

    请注意,我可以访问 refreshControl,因为我在 UITableViewController 中,但您也可以轻松地将其添加到 UIViewController 中。

    从您的代码中删除 if refresh else ... 并将您的重新加载 UITableView 和 endRefreshing 放在我上面提到的主线程上

    【讨论】:

    • 我已经更新了 CustomVC 类实现的问题,其中我添加了刷新控制。我必须使用自定义类,因为我在很多地方都在使用它。
    • 它不起作用。仅供参考 fetchContent() 已经返回到主线程。我已经更新了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 2020-05-01
    • 2016-06-25
    相关资源
    最近更新 更多