UIRfreshControl не обновляется при программном запуске

Я пытаюсь показать элемент управления обновлением сразу после загрузки представления, чтобы показать, что я получаю данные из Parse. Элемент управления обновлением работает должным образом, когда приложение запущено, но я не могу заставить его запускаться программно из любого места в моем приложении. Это код, который не работает:

 override func viewDidAppear(animated: Bool) {
    self.refresher.beginRefreshing()
 }

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


person Christian Ayscue    schedule 16.02.2015    source источник
comment
Проверьте этот вопрос/ответ UIRefreshControl не работает при программном вызове   -  person Bardh Lohaj    schedule 16.02.2015


Ответы (2)


Мне нужно было добавить задержку между setContentOffset и вызовом self.refreshControl?.sendActions(for: .valueChanged). Без задержки атрибут attributeTitle элемента refreshControl не будет отображаться.

Это работает в iOS 10 (Swift 3):

self.tableView.setContentOffset(CGPoint(x:0, y:self.tableView.contentOffset.y - (self.refreshControl!.frame.size.height)), animated: true)

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.2, execute: {
  self.refreshControl?.sendActions(for: .valueChanged)
})
person crow    schedule 25.09.2016
comment
Я попробовал ваше решение, но оно не анимируется. - person Zac; 23.10.2016
comment
Первый self.tableView.setContentOffset(CGPoint(x:0, y:self.tableView.contentOffset.y - (self.refreshControl!.frame.size.height)), animated: true) + self.refreshControl?.beginRefreshing() у меня работает на iOS 10. Не нужен вызов sendActions. - person nmdias; 12.07.2017
comment
Спасибо. Без задержки заголовок не появляется! - person hendra; 01.12.2017
comment
Я удивлен, что никто не поднял этот вопрос: я бы предложил вызывать требуемый метод напрямую, а не использовать целевое действие через метод sendActions(for:). Для меня это похоже на обходной путь - зачем ждать 0,2 секунды (или любое время), если можно сразу выполнить всю необходимую работу? - person derpoliuk; 31.03.2018

Вот расширение, работающее на 10.3:

extension UIRefreshControl {
    func refreshManually() {
        if let scrollView = superview as? UIScrollView {
            scrollView.setContentOffset(CGPoint(x: 0, y: scrollView.contentOffset.y - frame.height), animated: false)
        }
        beginRefreshing()
        sendActions(for: .valueChanged)
    }
}
person henrique    schedule 07.09.2017
comment
SendAction(for:) вызвал рекурсивный вызов, который создал неожиданное поведение, из-за чего метод вызывал себя рекурсивно. В остальном расширение работает отлично. - person Austin Betzer; 05.08.2020