UIRefreshControl: ¿Cómo hago que la acción de actualización ocurra después de que se suelta el toque?

Escucha de mucho time, la primera vez que llama en el desbordamiento de la stack. Se gentil.

Estoy implementando UIRefreshControl en un UITableView para actualizar los datos de la tabla. En otras implementaciones pull-to-refresh, el process de actualización no comienza hasta que el dedo del usuario se levanta mientras se encuentra en la distancia de actualización del tirón. UIRefreshControl no parece inmediatamente que tiene esta personalización.

Mi código de inicio UIRefreshControl:

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; [refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged]; [self.tableView addSubview:refreshControl]; 

Mi actualización: el código es bastante básico:

 -(void)refresh:(id)sender { (... refresh code ...) [sender endRefreshing]; } 

¿Cómo puedo demorar la function de actualización: hasta que el usuario quite el dedo del tirón?

También me he quedado con el mismo problema. No creo que mi enfoque sea muy agradable, pero parece que funciona.

  1. Init UIRefreshControl

     UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; self.refreshControl = refreshControl; 
  2. Compruebe el estado de UIRefreshControl cuando el usuario termine de arrastrar la tabla ( UITableViewDelegate cumple con UIScrollViewDelegate )

     - (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView { if( self.refreshControl.isRefreshing ) [self refresh]; } 
  3. Tabla de actualización

     - (void)refresh { [self.refreshControl endRefreshing]; // TODO: Update here your items [self.tableView reloadData]; } 

Espero que te ayude.

UIRefreshControl ya tiene adaptaciones para comenzar en el momento "correcto". El comportamiento correcto para un control pull-to-refresh es iniciar la actualización después de que el usuario haya cruzado un umbral "suficiente", no cuando el usuario haya liberado su arrastre.

Para lograr esto, debe modificar su método -refresh: para verificar cuándo el control ha realizado la transición al estado de refreshing :

 -(void)refresh:(id)sender { UIRefreshControl *refreshControl = (UIRefreshControl *)sender; if(refreshControl.refreshing) { (... refresh code ...) } } 

Tenga en count que cualquier método que invoque para su (... refresh code ...) debe ser asíncrono, de modo que su UI no se congele. Debe cambiar a queue principal y call -endRefreshing al final de su bloque (... refresh code ...) , en lugar de al final de -refresh: ::

 - (void)refresh:(id)sender { __weak UIRefreshControl *refreshControl = (UIRefreshControl *)sender; if(refreshControl.refreshing) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ /* (... refresh code ...) */ dispatch_sync(dispatch_get_main_queue(), ^{ [refreshControl endRefreshing]; //reload the table here, too }); }); } } 

Cambiar el evento de control a UIControlEventTouchUpInside no funcionará porque UIRefreshControl no es un componente de interfaz de usuario destinado a interactuar directamente con. El usuario nunca tocará el UIRefreshControl , por lo que no se puede activar ningún evento UIControlEventTouchUpInside .