Я установил UIRefreshControl в моем UITableViewController (который находится внутри UINavigationController), и он работает, как ожидалось (т. Е. При спуске срабатывает правильное событие). Однако, если я программно вызываю beginRefreshing
метод экземпляра в элементе управления обновлением, например:
[self.refreshControl beginRefreshing];
Ничего не произошло. Он должен оживить и показать спиннер. endRefreshing
Метод работает должным образом , когда я звоню , что после обновления.
Я разработал базовый прототип проекта с таким поведением, и он работает правильно, когда мой UITableViewController добавляется непосредственно в корневой контроллер представления делегата приложения, например:
self.viewController = tableViewController;
self.window.rootViewController = self.viewController;
Но если я tableViewController
сначала добавлю к UINavigationController, а затем добавлю контроллер навигации в качестве rootViewController
, beginRefreshing
метод перестанет работать. Например
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:tableViewController];
self.viewController = navController;
self.window.rootViewController = self.viewController;
Я считаю, что это как-то связано с иерархиями вложенных представлений в контроллере навигации, которые не очень хорошо сочетаются с элементом управления обновлением - есть предложения?
Спасибо
UITableViewController имеет автоматическиAdjustsScrollViewInsets свойство после iOS 7. Табличное представление может уже иметь contentOffset, обычно (0, -64).
Итак, правильный способ показать refreshControl после начала обновления программирования - это добавить высоту refreshControl к существующему contentOffset.
источник
-64
лучше использовать-self.topLayoutGuide.length
Вот расширение Swift, использующее описанные выше стратегии.
источник
sendActionsForControlEvents(UIControlEvents.ValueChanged)
эту функцию в конце, иначе логика логики обновления не будет запущена.Ни один из других ответов не помог мне. Они заставят счетчик показывать и вращаться, но само действие обновления никогда не произойдет. Это работает:
Обратите внимание: в этом примере используется табличное представление, но с тем же успехом оно могло быть и представлением коллекции.
источник
SVPullToRefresh
, как программно сваливать?[tableView triggerPullToRefresh];
» См.: Github.com/samvermette/ SVPullToRefreshscrollView.contentOffset = CGPoint(x: 0, y: scrollView.contentOffset.y - frame.height)
Уже упомянутый подход:
сделает спиннер видимым. Но он не оживал. Единственное, что я изменил, - это порядок этих двух методов, и все заработало:
источник
Для Swift 4 / 4.1
Комбинация существующих ответов делает работу за меня:
Надеюсь это поможет!
источник
См. Также этот вопрос
UIRefreshControl не показывает шип при вызове beginRefreshing и contentOffset равен 0
Для меня это похоже на ошибку, потому что она возникает только тогда, когда свойство contentOffset tableView равно 0
Я исправил это с помощью следующего кода (метод для UITableViewController):
источник
beginRefreshing
, только об изменении его состояния. Насколько я понимаю, это сделано для того, чтобы не запускать действие обновления дважды, чтобы, если программно вызываемое обновление все еще работало, действие, инициированное пользователем, не запускало другое.Вот расширение Swift 3 и более поздних версий, которое показывает счетчик, а также его анимацию.
источник
asyncAfter
самом деле это то, что заставляет анимацию счетчика работать (iOS 12.3 / Xcode 10.2)Мне это отлично подходит:
Swift 3:
источник
В Swift 5 мне не хватало только звонка
refreshControl.sendActions(.valueChanged)
. Я сделал расширение, чтобы было чище.источник
В дополнение к решению @Dymitry Shevchenko.
Я нашел хорошее решение этой проблемы. Вы можете создать расширение для
UIRefreshControl
этого метода перезаписи:Вы можете использовать новый класс, установив собственный класс в Identity Inspector для управления обновлением в Interface Builder.
источник
Форт Свифт 2.2+
источник
Если вы используете Rxswift для swift 3.1, можете использовать ниже:
Это работает для Swift 3.1, iOS 10.
источник
sendActions
триггер,rx
который делает этот ответ связанным с тем, чтоRxSwift
кому-то интересно с первого взглядаself.tableView.setContentOffset(CGPoint(x:0, y:self.tableView.contentOffset.y - (refreshControl.frame.size.height)), animated: true)
протестировано на Swift 5
использовать это в
viewDidLoad()
источник
Я использую ту же технику для отображения визуального знака "данные обновляются". В результате пользователь извлекает приложение из фона, а каналы / списки будут обновляться с помощью пользовательского интерфейса, как если бы пользователь сам обновлял таблицы. Моя версия содержит 3 вещи
1) Кто отправляет "просыпаться"
2) Наблюдатель в UIViewController
3) Протокол
источник