Проблема с UIRefreshControl (pull to refresh)

xcode
ios

#1

Проблема в следующем. Есть ViewController и в него встроен tableView. Есть массив с данными, которые и отображает tableView. Данные в массив приходят с сервера. Все работает хорошо, без единого глюка (делал как в курсе про tableView).

Теперь к проблеме. Для обновления таблицы раньше использовал кнопку (UIButton) которая очищала массив, и затем запускала функцию загрузки данных и соответственно после загрузки обновляла таблицу. Все работает отлично! никаких проблем не наблюдается.
Решил уйти от кнопки “обновить” и сделать это с помощью pull to refresh.

var refreshControl: UIRefreshControl = {
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action:
        #selector(handleRefresh(_:)),
                             for: UIControlEvents.valueChanged)
    refreshControl.tintColor = UIColor.gray
    return refreshControl
}()

@objc func handleRefresh(_ refreshControl: UIRefreshControl) {
    matchArray = []
    loadData()
    refreshControl.endRefreshing()
}

Так вот, когда я обновляю с помощью нажатия кнопки, она выполняет код который ниже, то все проходит хорошо!
@IBAction func refreshPage(_ sender: UIBarButtonItem) {
matchArray = []
loadData()
}
а если я эти самые методы запускаю в handleRefresh, то происходит ошибка!!! Почему на кнопку работает нормально, а при pull to refresh ошибка???
Ошибка index out of range. Типа массив пуст, и соответсвенно tableview не может отобразить данные. НО!!! ошибка возникает только если быстро потянуть tableView вниз и бросить. А если “не бросать” а потянуть, подождать секунду и отпустить, то все отлично загрузится!!!


#2

Наткнулся на информацию о том, что UIRefreshControl нормально работает только с tableViewController, и мой баг может быть связан с тем, что я использую ViewController. Кто что думает?


#3

На это сообщение поступили жалобы от участников сообщества, поэтому оно временно скрыто.


#4

Да честно говоря уже не знаю куда копать. Только осталось сделать тоже самое, на UITableViewController. Говорю же, что метод обновления (нажимая на кнопку) работает. Но тот же самый метод не работает при “pullToRefresh”. В этом и странность. И не работает если “потянуть и тут же бросить” tableView. Но если немного подождать, то все нормально.


#5

сделай вконце строки refreshControl.tintColor = UIColor.gray

tableView.addSubview(refreshControl)`

и в функции до пиши "tableview.reloadData()" :

 @objc func handleRefresh(_ refreshControl: UIRefreshControl) {
    matchArray = []
    loadData()
     tableView.reloadData()
    refreshControl.endRefreshing()
}

#6

Удалось ли решить проблему? У меня сейчас такая же история, обновляю сильным оттягиванием вниз -вылетает index out of range, быстро тяну-все работает


#7

я у вас в коде не увидел, вот этого tableView.refreshControl = refreshControl.
А иначе как как ваша таблица узнает о существовании вашего refreshControl ?