Écouteur de longue date, premier appelant ici en cas de débordement de pile. Sois gentil.
J'implémente UIRefreshControl sur un UITableView pour actualiser les données de la table. Sur les autres implémentations pull-to-refresh, le processus de rafraîchissement ne commence pas tant que le doigt de l'utilisateur n'est pas levé alors qu'il se trouve dans la distance de rafraîchissement du pull. UIRefreshControl ne semble pas immédiatement avoir cette personnalisation.
Mon code d'initialisation UIRefreshControl:
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
[self.tableView addSubview:refreshControl];
Mon rafraîchissement: le code est assez basique:
-(void)refresh:(id)sender {
(... refresh code ...)
[sender endRefreshing];
}
Comment puis-je retarder la fonction de rafraîchissement jusqu'à ce que l'utilisateur retire son doigt de la traction?
Je suis également resté avec le même problème. Je ne pense pas que mon approche soit très agréable, mais il semble que cela fonctionne.
Init UIRefreshControl
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
self.refreshControl = refreshControl;
Vérifier l'état de UIRefreshControl
lorsque l'utilisateur a fini de faire glisser la table (UITableViewDelegate
est conforme à UIScrollViewDelegate
)
- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView
{
if( self.refreshControl.isRefreshing )
[self refresh];
}
Mettre à jour le tableau
- (void)refresh
{
[self.refreshControl endRefreshing];
// TODO: Update here your items
[self.tableView reloadData];
}
J'espère que cela vous aidera.
UIRefreshControl
propose déjà des hébergements pour commencer au "bon" moment. Le comportement correct pour un contrôle pull-to-refresh consiste à démarrer le rafraîchissement après que l'utilisateur a franchi un certain seuil "assez loin", pas lorsque l'utilisateur a relâché son glisser.
Pour ce faire, vous devez modifier votre -refresh:
méthode pour vérifier quand le contrôle est passé à l'état refreshing
:
-(void)refresh:(id)sender {
UIRefreshControl *refreshControl = (UIRefreshControl *)sender;
if(refreshControl.refreshing) {
(... refresh code ...)
}
}
Notez que toute méthode que vous appelez pour votre (... refresh code ...)
doit être asynchrone, afin que votre interface utilisateur ne se fige pas. Vous devez passer à la file d'attente principale et appeler -endRefreshing
à la fin de votre (... refresh code ...)
bloquer, au lieu de à la fin 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
});
});
}
}
La modification de l'événement de contrôle sur UIControlEventTouchUpInside
ne fonctionnera pas car UIRefreshControl
n'est pas un composant d'interface utilisateur destiné à être directement interagi avec. L'utilisateur ne pourra jamais toucher le UIRefreshControl
, donc aucun événement UIControlEventTouchUpInside
ne pourra être déclenché.
La programmation de l'actualisation pour qu'elle ne se produise que lorsque le doigt s'est levé peut être obtenue en utilisant NSRunLoop
. Appelez -(void)performInModes:(NSArray<NSRunLoopMode> *)modes block:(void (^)(void))block;
avec NSRunLoopDefaultMode
dans le tableau.
Pendant que le toucher est maintenu, le mode runloop est UITrackingRunLoopMode
, il ne reviendra à la valeur par défaut qu'après le décollage.