UIRfreshControl работает некорректно

Колесо обновления останавливается при заполнении на 95%, и обновление будет работать только в том случае, если с самого верха экрана вы дойдете до низа.

lazy var refreshControl: UIRefreshControl = {
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action:
       #selector(VFeedVC.refresh(_:)),
                            for: .valueChanged)
    return refreshControl
}()

override func viewDidLoad() {
    self.tableView.addSubview(refreshControl)
}

func refresh(_ sender: Any) {
    Metric.sendEvent("RefreshFeed")
    self.refreshControl.beginRefreshing()
    self.getFeeds(self.user.id)
}

func getFeeds(_ userId: Int) {
    VNetwork.getFeeds(userId) { feeds in
        self.feeds = feeds
        self.tableView.isHidden = self.feeds.count == 0
        self.configureCells()
        self.refreshControl.endRefreshing()
        self.tableView.reloadData()
    }
}

введите описание изображения здесь


person Artyom Vlasenko    schedule 30.01.2018    source источник


Ответы (4)


Это работает для меня на iOS 11:

override func viewDidLoad() {
    self.tableView.refreshControl = refreshControl
    self.tableView.addSubview(refreshControl)
}

Кроме того, вам не нужно явно указывать элементу управления обновлением, чтобы начать обновление, поэтому этого достаточно:

func refresh(_ sender: Any) {
    Metric.sendEvent("RefreshFeed")
    self.getFeeds(self.user.id)
}

Также убедитесь, что в обратном вызове для VNetwork.getFeeds(userId) { feeds in вы находитесь в основном потоке.

person Milan Nosáľ    schedule 30.01.2018
comment
Эта проблема была, если в раскадровке у вашего viewController была опция произвольной формы. Включите фиксированный размер ViewController, мне это поможет - person Artyom Vlasenko; 20.11.2018

с self.tableView.refreshControl = refreshControlвы можете добавить refreshControl непосредственно в табличное представление, также вам не нужно вызывать self.refreshControl.beginRefreshing()

lazy var refreshControl: UIRefreshControl = {
   let refreshControl = UIRefreshControl()
   refreshControl.addTarget(self, action:
       #selector(VFeedVC.refresh(_:)),
                            for: .valueChanged)
   return refreshControl
}()
override func viewDidLoad() {

self.tableView.refreshControl = refreshControl
self.tableView.addSubview(refreshControl)
}
func refresh(_ sender: Any) {
    Metric.sendEvent("RefreshFeed")
    self.getFeeds(self.user.id)
}

func getFeeds(_ userId: Int) {
    VNetwork.getFeeds(userId) { feeds in
        self.feeds = feeds
        self.tableView.isHidden = self.feeds.count == 0
        self.configureCells()
        self.refreshControl.endRefreshing()
        self.tableView.reloadData()
    }
}
person Timm Schärli    schedule 30.01.2018
comment
Спасибо, мне помогло! - person Artyom Vlasenko; 30.01.2018
comment
@ArtemVlasenko Я имел в виду тот факт, что вы приняли ответ, который просто повторил то, что я уже предлагал ранее ... так что, хотя здесь нет полиции, было бы справедливо принять мой (если только я не вижу чего-то, что делает Ответ Тимма лучше моего) - person Milan Nosáľ; 31.01.2018
comment
@MilanNosáľ Хорошо, бро) - person Artyom Vlasenko; 31.01.2018

Поместите refreshControl.endRefreshing() после tableView.reloadData() следующим образом:

tableView.reloadData()
DispatchQueue.main.async {
    self.refreshControl.endRefreshing()
}
person Clegrand    schedule 30.01.2018

Попробуйте это, это работа для меня.

var refreshControl: UIRefreshControl!

override func viewDidLoad() {
        refreshControl = UIRefreshControl()
        refreshControl.tintColor = UIColor.white
        self.tblPartyList.addSubview(refreshControl)
        refreshControl.addTarget(self, action:#selector(handleRefresh(_:)), for: UIControlEvents.valueChanged)
}
@objc func handleRefresh(_ refreshControl: UIRefreshControl) {

}
person Dixit Akabari    schedule 30.01.2018