iphone - uirefreshcontrol example
UIRefreshControl-¿Cómo hago que la acción de actualización se produzca después de soltar el toque? (3)
Oyente desde hace mucho tiempo, el que llama por primera vez aquí en el desbordamiento de pila. Sé gentil.
Estoy implementando UIRefreshControl en un UITableView para actualizar los datos de la tabla. En otras implementaciones de extracción para actualizar, el proceso de actualización no comienza hasta que el dedo del usuario se levanta mientras está en la distancia de actualización de la extracción. UIRefreshControl no parece inmediatamente que tenga esta personalización.
Mi código de inicio de 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 retrasar la función actualizar: hasta que el usuario retire su dedo del tirón?
La programación de la actualización para que solo se produzca cuando se levanta el dedo se puede lograr utilizando NSRunLoop
. Call -(void)performInModes:(NSArray<NSRunLoopMode> *)modes block:(void (^)(void))block;
con NSRunLoopDefaultMode
en la matriz.
Mientras se mantiene presionado el botón táctil, el modo Runloop es UITrackingRunLoopMode
, solo regresará a los UITrackingRunLoopMode
predeterminados después del despegue.
También me he quedado con el mismo problema. No creo que mi enfoque sea muy bueno, pero parece que funciona.
Init
UIRefreshControl
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; self.refreshControl = refreshControl;
Compruebe el estado de
UIRefreshControl
cuando el usuario termine de arrastrar la tabla (UITableViewDelegate
cumple conUIScrollViewDelegate
)- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView { if( self.refreshControl.isRefreshing ) [self refresh]; }
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 de un control de extracción para actualizar es iniciar la actualización después de que el usuario haya cruzado algún umbral "lo suficientemente lejos", no cuando el usuario haya liberado su resistencia.
Para lograr esto, necesita modificar su método -refresh:
para verificar cuándo el control ha pasado al estado de refreshing
:
-(void)refresh:(id)sender {
UIRefreshControl *refreshControl = (UIRefreshControl *)sender;
if(refreshControl.refreshing) {
(... refresh code ...)
}
}
Tenga en cuenta que cualquier método que llame para su (... refresh code ...)
debe ser asíncrono, para que su interfaz de usuario no se congele. Debes cambiar a la cola principal y llamar a -endRefreshing
al final de tu (... refresh code ...)
bloque, 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 la interfaz de usuario que se pretende interactuar directamente. El usuario nunca tocará el UIRefreshControl
, por lo que no se puede activar el evento UIControlEventTouchUpInside
.