UIRefreshControl в UIScrollView не исчезает при endRefreshing - PullRequest
0 голосов
/ 23 мая 2019

Я пытался использовать UIRefreshControll в UIScrollView, но у меня была проблема, что мне нужно было много прокручивать, чтобы обновить его.Мне нужно было использовать обе руки, чтобы заставить его работать, поэтому я решил написать логику прокрутки, чтобы начать обновление.

Теперь проблема в том, что иногда функция endRefreshing не заставляет представление UIRefreshControll исчезать, и я в итоге получаюимея его там навсегда.

Я попытался вызвать endRefreshing в главной очереди с задержкой, и он не работает.Я также попытался установить isHidden в true, а также removeFromSuperView.Мне не повезло заставить его работать.

import UIKit

class RefreshableView : UIView {

    @IBOutlet weak var scrollView: UIScrollView!

    private let refreshControl = UIRefreshControl()
    private var canRefresh = true
    var refreshFunction: (() -> ())?

    func setupUI() {
        backgroundColor = ColorName.grayColor.color
        scrollView.refreshControl = refreshControl
    }

    func endRefreshing() {
        self.refreshControl.endRefreshing()
    }
}

extension RefreshableView: UIScrollViewDelegate {

    func scrollViewDidScroll(_ scrollView: UIScrollView) {

        if scrollView.contentOffset.y < -100 {
            if canRefresh && !self.refreshControl.isRefreshing {

                self.canRefresh = false
                self.refreshControl.beginRefreshing()

                self.refreshFunction?()
            }
        } else if scrollView.contentOffset.y >= 0 {
            self.canRefresh = true
        }
    }
}

1 Ответ

1 голос
/ 23 мая 2019

В представлении прокрутки refreshControl автоматически обрабатывается функция обновления, поэтому вам не нужен код scrollViewDidScroll().

Предположим, что ваша раскадровка выглядит примерно так, где:

  • представление с красным фоном является экземпляром RefreshableView class
  • содержит представление прокрутки (подключено через @IBOutlet)
  • и некоторый контент в представлении прокрутки (здесь у меня есть только одна метка)

enter image description here

Ваш код может быть таким:

class RefreshableView : UIView {

    @IBOutlet var scrollView: UIScrollView!

    private let refreshControl = UIRefreshControl()

    var refreshFunction: (() -> ())?

    func setupUI() {
        backgroundColor = .gray

        refreshControl.addTarget(self, action: #selector(didPullToRefresh), for: .valueChanged)

        scrollView.refreshControl = refreshControl
    }

    @objc func didPullToRefresh() {
        print("calling refreshFunction in controller")
        self.refreshFunction?()
    }

    func endRefreshing() {
        print("end refreshing called from controller")
        self.refreshControl.endRefreshing()
    }

}

class RefreshTestViewController: UIViewController {

    @IBOutlet var theRefreshableView: RefreshableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        theRefreshableView.setupUI()

        theRefreshableView.refreshFunction = {
            print("simulating refresh for 2 seconds...")
            DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
                [weak self] in
                guard let self = self else { return }
                // do what you want to update the contents of theRefreshableView
                // ...
                // then tell theRefreshableView to endRefreshing
                self.theRefreshableView.endRefreshing()
            }
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...