Solo es curioso, ya que no parece posible de inmediato, pero ¿hay una manera astuta de aprovechar la nueva UIRefreshControl
clase iOS 6 sin usar una UITableViewController
subclase?
A menudo uso un UIViewController
con una UITableView
subvista y me conforma con UITableViewDataSource
y en UITableViewDelegate
lugar de usar un UITableViewController
absoluto.
UITableViewController
archivo y solicitar una API de solicitud de error para usar unUIRefreshControl
con unUITableView
directamente.Respuestas:
En una corazonada, y basado en la inspiración de DrummerB, intenté simplemente agregar una
UIRefreshControl
instancia como subvista a miUITableView
. ¡Y mágicamente simplemente funciona!Esto agrega una
UIRefreshControl
vista sobre su tabla y funciona como se espera sin tener que usar unUITableViewController
:)EDITAR: Esto anterior todavía funciona, pero como algunos han señalado, hay un ligero "tartamudeo" al agregar el UIRefreshControl de esta manera. Una solución para eso es crear una instancia de UITableViewController y luego configurar UIRefreshControl y UITableView para eso, es decir:
fuente
-[UITableViewController setRefreshControl:]
) continuará funcionando.handleRefresh:
hay un cambio inesperado en el valor de la vista de desplazamientocontentInsets
durante una fracción de segundo. ¿Alguien más experimenta esto o tiene una solución? (¡Sí, sé que esto no es compatible en primer lugar!)UITableViewController
y estará "haciéndolo bien".[_tableView insertSubview:_refreshControl atIndex:0];
. Probado con iOS 7 y 8;)Para eliminar el tartamudeo causado por la respuesta aceptada, puede asignar su
UITableView
aUITableViewController
.EDITAR:
Una manera de añadir un
UIRefreshControl
sinUITableViewController
sin tartamudeo y retener la animación agradable después de actualizar los datos en el tableview.Más tarde, cuando maneje los datos actualizados ...
fuente
[_tablewViewController didMoveToParentViewController:self];
después de agregar la subvista.self.tableView = _tableViewController.tableView;
debería ser_tableViewController.tableView = self.tableView
Lo que probaría es usar la vista de contenedor dentro de ViewController que está usando. puede definir una subclase limpia de UITableViewController con una vista de tabla dedicada y colocarla en ViewController.
fuente
self.childViewControllers.firstObject
.prepareForSegue
para obtener una referencia al objeto UITableViewController en una vista de contenedor, ya que esto se desencadena inmediatamente como un evento segue en la creación de instancias desde el guión gráfico.Bueno, UIRefreshControl es una subclase de UIView, por lo que puede usarlo solo. Sin embargo, no estoy seguro de cómo se representa. La representación podría simplemente depender del marco, pero también podría depender de un UIScrollView o el UITableViewController.
De cualquier manera, será más un truco que una solución elegante. Le recomiendo que busque en uno de los clones de terceros disponibles o escriba el suyo propio.
ODRefreshControl
SlimeRefresh
fuente
Intente retrasar la llamada al
-endRefresh
método refreshControl por una fracción de segundo después de que tableView recargue su contenido, ya sea utilizando NSObject-performSelector:withObject:afterDelay:
o GCDdispatch_after
.Creé una categoría en UIRefreshControl para esto:
Lo probé y esto también funciona en Vistas de colección. Me di cuenta de que un retraso tan pequeño como 0.01 segundos es suficiente:
fuente
UIRefreshControl
.[self performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.01]
-performSelector:withObject:afterDelay:
GCD o para esto depende de un gusto personal.es sencillo
Si quieres aprender sobre iOS 10 UIRefreshControl lee aquí .
fuente
Agregar el control de actualización como una subvista crea un espacio vacío arriba de los encabezados de sección.
En cambio, incruste un UITableViewController en mi UIViewController, luego cambié mi
tableView
propiedad para apuntar hacia el incrustado, ¡y viola! Cambios mínimos de código. :-)Pasos:
@IBOutlet weak var tableView: UITableView!
con el del UITableViewController recién incrustado, como se muestra a continuaciónfuente
Para Swift 2.2.
Primero haga UIRefreshControl ().
En su método viewDidLoad () agregue:
Y hacer la función de actualización
fuente
Aquí hay otra solución que es un poco diferente.
Tuve que usarlo debido a algunos problemas de la jerarquía de vistas que tenía: estaba creando algunas funcionalidades que requerían pasar vistas a diferentes lugares en la jerarquía de vistas, que se rompieron al usar una vista de tabla de UITableViewController b / c, la vista de tabla es la vista raíz de UITableViewController ( self.view) y no solo una vista normal, creó jerarquías inconsistentes de controlador / vista y causó un bloqueo.
Básicamente, cree su propia subclase de UITableViewController y anule loadView para asignar self.view una vista diferente, y anule la propiedad tableView para devolver una vista de tabla separada.
por ejemplo:
Cuando se combina con la solución de Keller, esto será más robusto en el sentido de que tableView ahora es una vista normal, no una vista raíz de VC, y será más robusto frente a cambios en las jerarquías de vista. Ejemplo de usarlo de esta manera:
Hay otro uso posible para esto:
Dado que la subclasificación de esta manera separa self.view de self.tableView, ahora es posible usar este UITableViewController como un controlador más regular y agregar otras subvistas a self.view sin las rarezas de agregar subvistas a UITableView, por lo que uno puede considerar hacer su ver los controladores directamente una subclase de UITableViewController en lugar de tener hijos de UITableViewController.
Algunas cosas a tener en cuenta:
Dado que estamos anulando la propiedad tableView sin llamar a super, puede haber algunas cosas a tener en cuenta y que debemos manejar cuando sea necesario. Por ejemplo, establecer la vista de tabla en mi ejemplo anterior no agregará la vista de tabla a self.view y no establecerá el marco que es posible que desee hacer. Además, en esta implementación no se proporciona una vista de tabla predeterminada cuando se instancia la clase, que también es algo que puede considerar agregar. No lo incluyo aquí porque es caso por caso, y esta solución en realidad encaja bien con la solución de Keller.
fuente
Prueba esto,
Las soluciones anteriores están bien, pero tableView.refreshControl está disponible solo para UITableViewController, hasta iOS 9.xy viene en UITableView desde iOS 10.x en adelante.
Escrito en Swift 3 -
fuente
La primera sugerencia de Keller provoca un extraño error en iOS 7, donde el recuadro de la tabla aumenta después de que vuelve a aparecer el controlador de vista. Cambiar a la segunda respuesta, usando el controlador uitableview, me arregló las cosas.
fuente
Resulta que puede usar lo siguiente cuando usa un UIViewController con una subvista UITableView y se ajusta a UITableViewDataSource y UITableViewDelegate:
fuente
self.refreshControl
es una propiedad para unUITableViewController
, no unUIViewController
.