Потяните, чтобы обновить и индикатор активности на представлении - PullRequest
0 голосов
/ 01 июля 2019

У меня есть VC, содержащий табличное представление.Я реализовал функцию pull для обновления в представлении таблицы и индикатор активности в представлении.При нажатии, чтобы обновить представление таблицы, мерцает, как будто оно завершило обновление и перезагружается, пока я опускаю и продолжаю удерживать представление таблицы.Я не уверен, где это идет не так.Ниже мой код.Как правильно его реализовать?

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() {
    }
}

Fetch Content

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

1 Ответ

0 голосов
/ 01 июля 2019

Попробуйте эту технику

 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 в основной поток, как я упоминал выше

...