web-dev-qa-db-fra.com

UIRefreshControl - Comment puis-je faire en sorte que l'action d'actualisation se produise après le relâchement du toucher?

É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?

29
outphase

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.

  1. Init UIRefreshControl

    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    self.refreshControl = refreshControl;
    
  2. 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];
    }
    
  3. Mettre à jour le tableau

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

J'espère que cela vous aidera.

37
Ned

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

21
user1059264

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.

3
DrMickeyLauer