example control ios uitableview uirefreshcontrol

ios - example - uirefreshcontrol swift 4



UIRefreshControl on viewDidLoad (4)

Estoy usando el siguiente código para crear un UIRefreshControl:

- (void) viewDidLoad { [super viewDidLoad]; UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; [refreshControl addTarget:self action:@selector(doLoad) forControlEvents:UIControlEventValueChanged]; self.refreshControl = refreshControl; } - (void) doLoad { dispatch_async(dispatch_get_global_queue(0, 0), ^{ // Instead of sleeping, I do a webrequest here. [NSThread sleepForTimeInterval: 5]; dispatch_async(dispatch_get_main_queue(), ^{ [tableView reloadData]; [self.refreshControl endRefreshing]; }); }); }

Funciona muy bien Si navego a mi vista, arrastre la tabla, se ejecuta el código y se muestran los datos.

Sin embargo, lo que me gustaría hacer es tener la vista en el estado de ''carga'' tan pronto como aparezca (de esa manera el usuario sabe que algo está pasando). He intentado agregar lo siguiente:

- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self.refreshControl beginRefreshing]; }

pero no parece funcionar. Cuando navego a la vista, parece una vista normal (el control de actualización no está visible), y cuando intento extraer el control de actualización, nunca se terminó de cargar.

Obviamente estoy haciendo esto de manera incorrecta. ¿Alguna sugerencia sobre cómo debo manejar esto?


La modificación manual de contentOffset es insegura e incorrecta y puede provocar un comportamiento inesperado en algunos casos. Esta solución funciona sin tocar el contentOffset en absoluto:

func showRefreshControl(show: Bool) { if show { refreshControl?.beginRefreshing() tableView.scrollRectToVisible(CGRectMake(0, 0, 1, 1), animated: true) } else { refreshControl?.endRefreshing() } }


Otra opción es disparar un UIControlEventValueChanged en su viewDidAppear: para activar una actualización inicial.


Prueba esto:

- (void) viewWillAppear: (BOOL) animated { [super viewWillAppear: animated]; self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height); [self.refreshControl beginRefreshing]; // kick off your async refresh! [self doLoad]; }

¡Recuerda llamar a endRefreshing en algún momento!

EDITAR para agregar la muestra de trabajo completa:

Este controlador de vista de muestra, creado y ejecutado en iOS6.1 como controlador de vista raíz, comienza con el UIRefreshControl ya visible y animándose cuando se inicia la aplicación.

TSTableViewController.h

@interface TSTableViewController : UITableViewController @end

TSTableViewController.m

#import "TSTableViewController.h" @implementation TSTableViewController { NSMutableArray* _dataItems; } - (void) viewDidLoad { [super viewDidLoad]; self.refreshControl = [UIRefreshControl new]; [self.refreshControl addTarget: self action: @selector( onRefresh: ) forControlEvents: UIControlEventValueChanged]; } - (void) viewWillAppear:(BOOL)animated { [super viewWillAppear: animated]; self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height); [self.refreshControl beginRefreshing]; [self onRefresh: nil]; } - (void) onRefresh: (id) sender { double delayInSeconds = 2.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ _dataItems = [NSMutableArray new]; for ( int i = 0 ; i < arc4random() % 100 ; i++ ) { CFUUIDRef uuid = CFUUIDCreate( NULL ); [_dataItems addObject: CFBridgingRelease(CFUUIDCreateString( NULL, uuid)) ]; CFRelease( uuid ); } [self.refreshControl endRefreshing]; [self.tableView reloadData]; }); } #pragma mark - Table view data source - (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView { return 1; } - (NSInteger) tableView:(UITableView *) tableView numberOfRowsInSection: (NSInteger) section { return _dataItems.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: nil]; cell.textLabel.text = [_dataItems objectAtIndex: indexPath.row]; return cell; } @end


- (void) viewDidAppear: (BOOL) animated { [super viewDidAppear: animated]; UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; [refreshControl addTarget:self action:@selector(doLoad) forControlEvents:UIControlEventValueChanged]; self.refreshControl = refreshControl; [self.refreshControl beginRefreshing]; }

Nunca configuras self.refreshControl