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?

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()
}

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];
}

¿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()
}

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.


-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


-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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.