He configurado un UIRefreshControl en mi UITableViewController (que está dentro de un UINavigationController) y funciona como se esperaba (es decir, pull down dispara el evento correcto). Sin embargo, si invoco programáticamente el beginRefreshing
método de instancia en el control de actualización como:
[self.refreshControl beginRefreshing];
No pasa nada. Debe animarse y mostrar la ruleta. El endRefreshing
método funciona correctamente cuando lo llamo después de la actualización.
Desarrollé un proyecto prototipo básico con este comportamiento y funciona correctamente cuando mi UITableViewController se agrega directamente al controlador de vista raíz del delegado de la aplicación, por ejemplo:
self.viewController = tableViewController;
self.window.rootViewController = self.viewController;
Pero si tableViewController
primero agrego el a un UINavigationController, luego agrego el controlador de navegación como el rootViewController
, el beginRefreshing
método ya no funciona. P.ej
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:tableViewController];
self.viewController = navController;
self.window.rootViewController = self.viewController;
Mi sensación es que esto tiene algo que ver con las jerarquías de vista anidadas dentro del controlador de navegación que no funcionan bien con el control de actualización, ¿alguna sugerencia?
Gracias
UITableViewController tiene la propiedad automáticamenteAdjustsScrollViewInsets después de iOS 7. Es posible que la vista de tabla ya tenga contentOffset, generalmente (0, -64).
Entonces, la forma correcta de mostrar refreshControl después de comenzar a actualizar mediante programación es agregar la altura de refreshControl al contentOffset existente.
fuente
-64
es mejor usarlo-self.topLayoutGuide.length
Aquí hay una extensión de Swift que utiliza las estrategias descritas anteriormente.
fuente
sendActionsForControlEvents(UIControlEvents.ValueChanged)
al final de esta función, de lo contrario no se ejecutará la lógica lógica de actualización real.Ninguna de las otras respuestas funcionó para mí. Harían que la ruleta se mostrara y girara, pero la acción de actualización en sí nunca sucedería. Esto funciona:
Tenga en cuenta que este ejemplo usa una vista de tabla, pero también podría haber sido una vista de colección.
fuente
SVPullToRefresh
, ¿cómo bajarlo programáticamente?[tableView triggerPullToRefresh];
" Ver: github.com/samvermette/ SVPullToRefreshscrollView.contentOffset = CGPoint(x: 0, y: scrollView.contentOffset.y - frame.height)
El enfoque ya mencionado:
haría visible la ruleta. Pero no se animaría. Lo único que cambié es el orden de estos dos métodos y todo funcionó:
fuente
Para Swift 4 / 4.1
Una combinación de respuestas existentes hace el trabajo por mí:
¡Espero que esto ayude!
fuente
Ver también esta pregunta
UIRefreshControl no se muestra espinoso cuando se llama a beginRefreshing y contentOffset es 0
Me parece un error, porque solo ocurre cuando la propiedad contentOffset de tableView es 0
Lo arreglé con el siguiente código (método para UITableViewController):
fuente
beginRefreshing
, solo que su estado cambia. Como lo veo, es para evitar que se inicie la acción de actualización dos veces, de modo que si una actualización llamada programáticamente aún se esté ejecutando, una acción iniciada por el usuario no iniciará otra.Aquí está Swift 3 y una extensión posterior que muestra el spinner y lo anima.
fuente
asyncAfter
realidad es lo que hace que el trabajo de animación spinner (IOS 12.3 / 10.2 Xcode)Funciona perfecto para mí:
Swift 3:
fuente
Para Swift 5, para mí lo único que faltaba era llamar
refreshControl.sendActions(.valueChanged)
. Hice una extensión para hacerlo más limpio.fuente
Además de la solución @Dymitry Shevchenko.
Encontré una buena solución a este problema. Puede crear una extensión para
UIRefreshControl
ese método de sobrescritura:Puede usar una nueva clase configurando una clase personalizada en Identity Inspector para el control de actualización en Interface Builder.
fuente
Fort Swift 2.2+
fuente
Si usa Rxswift para swift 3.1, puede usarlo a continuación:
Esto funciona para swift 3.1, iOS 10.
fuente
sendActions
disparador lorx
que hace que esta respuestaRxSwift
esté relacionada con el caso de que alguien se esté preguntando a primera vistaself.tableView.setContentOffset(CGPoint(x:0, y:self.tableView.contentOffset.y - (refreshControl.frame.size.height)), animated: true)
probado en Swift 5
usar esto en
viewDidLoad()
fuente
Utilizo la misma técnica para mostrar el signo visual "los datos se actualizan" del usuario. Un usuario trae la aplicación de resultados desde el fondo y las fuentes / listas se actualizarán con la interfaz de usuario, como los usuarios extraen tablas para actualizarse. Mi versión contiene 3 cosas
1) Quién envía "despertar"
2) Observador en UIViewController
3) El protocolo
fuente