拉动视图上的刷新和活动指示器

时间:2019-07-01 17:38:00

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

我有一个包含Table View的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
    }
    //....
}

1 个答案:

答案 0 :(得分:0)

尝试这种技术

 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刷新else ...并将您的UITableView和endRefreshing重新加载到主线程上,如上所述。