Tire para actualizar UITableView sin UITableViewController

180

Estoy tratando de implementar una función de extracción para actualizar en un UITableView dentro de un UIViewController. No puedo usar un UITableViewController porque quiero que el UITableView sea una subvista más pequeña en el controlador de vista, con algunas otras cosas encima. Supongo que esto es posible, pero ¿alguien ha visto una implementación?

Daniel Robinson
fuente

Respuestas:

465

Agregue un control de actualización directamente a un UITableViewsin usar un UITableViewController:

override func viewDidLoad() {
    super.viewDidLoad()
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: #selector(refresh(_:)), for: .valueChanged)

    if #available(iOS 10.0, *) {
        tableView.refreshControl = refreshControl
    } else {
        tableView.backgroundView = refreshControl
    }
}

@objc func refresh(_ refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}
Berik
fuente
1
Excelente y facil. Funciona para mí cuando lo probé en una vista de tabla agregada a UIViewController en iOS 7.0.4.
thandasoru
55
¿Alguien ha tenido el problema de que el control en sí no es visible pero parece funcionar bien?
visión remota
16
La vista de tabla parece saltar inesperadamente una vez que "hace clic". No estoy seguro de por qué todavía.
Bob Spryn
3
Descubrí que debe aparecer a la vista, no estoy seguro de si se trata de una función de iOS 7 - Todavía tengo que probarlo en iOS 8 ...
Jack Solomon
44
RefreshControl aparece en la parte superior de tableView. Lo arreglé: en tableView.insertSubview(refreshControl, atIndex: 0)lugar detableView.addSubview(refreshControl)
kbpontius
12

Objetivo-C :

Así es como puede implementar pull para actualizar para la vista de tabla. Igual que en el caso de la vista de colección. Simplemente reemplace la asignación de vista de tabla con la vista de colección.

UITableView *tableViewDemo  =  [[UITableView alloc]init];
tableViewDemo.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);
tableViewDemo.dataSource =  self;
tableViewDemo.delegate =  self;
[self.view addSubView: tableViewDemo];

UIRefreshControl *refreshController = [[UIRefreshControl alloc] init];
[refreshController addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[tableViewDemo addSubview:refreshController];

#pragma mark - Handle Refresh Method

-(void)handleRefresh : (id)sender
{
   NSLog (@"Pull To Refresh Method Called");
   [refreshController endRefreshing];
}
Manish Methani
fuente
¿Cómo la versión obj-c solo tiene 9 votos a favor cuando la versión rápida tiene> 430?
Chase Roberts
1
@ChaseRoberts, esa fue respondida el 13 de febrero, eche un vistazo al historial de edición, originalmente estaba en el objetivo-c, ya que en ese momento swift era nuevo, todos buscaban una versión rápida ... stackoverflow.com/posts / 15010646 / revisiones
Irfan
4

Esta solución de @berik funciona bien, pero el UIController se muestra en la parte superior del UITableViewController. La forma de solucionarlo es haciendo este cambio:

override func viewDidLoad() {
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged)
    tableView.backgroundView = refreshControl // <- THIS!!!
}

func refresh(refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}
Andres
fuente
3
El refreshControl aparece en la parte superior de la tabla Ver para mí, pero su sugerencia hace que refreshControldesaparezca, no aparezca debajo de tableView. Lo arreglé por: tableView.insertSubview (refreshControl, atIndex: 0) en lugar de tableView.addSubview (refreshControl)
kbpontius
3

Implementé EGORefreshTableHeaderView con un UIViewController y una vista de tabla simple, el truco es que en los lugares donde EGO toma una vista de desplazamiento como parámetro, si observa que la vista de tabla hereda de la vista de desplazamiento.

Solo requiere eso y algunas conexiones adicionales :)

Espero que esto ayude.

Juan Alberto López Cavallotti
fuente
-1

Parece que si crea UIRefreshControl dentro del método loadView de viewController , todo funciona bien. El UIRefreshControl se comporta como debería. Probado con iOS 7.1 y iOS 8.2

Giannis Giannopoulos
fuente
-1

Terminé usando ODRefreshControl . No necesita ningún truco como el anterior tableView.backgroundView = refreshControl, funciona casi de la misma manera y ofrece una interfaz de usuario más atractiva.

Alex Bin Zhao
fuente