129 votes

UIRefreshControl - beginRefreshing ne fonctionne pas lorsque UITableViewController se trouve dans UINavigationController

J'ai configuré un UIRefreshControl dans mon UITableViewController (qui se trouve à l'intérieur d'un UINavigationController) et il fonctionne comme prévu (c'est-à-dire que le pull down déclenche l'événement correct). Cependant, si j'invoque de manière programmatique l'élément beginRefreshing sur le contrôle de rafraîchissement comme :

[self.refreshControl beginRefreshing];

Rien ne se passe. Il devrait s'animer vers le bas et montrer le spinner. Le site endRefreshing fonctionne correctement lorsque je l'appelle après l'actualisation.

J'ai créé un projet prototype de base avec ce comportement et il fonctionne correctement lorsque mon UITableViewController est ajouté directement au contrôleur de vue racine du délégué de l'application, par exemple :

self.viewController = tableViewController;
self.window.rootViewController = self.viewController;

Mais si j'ajoute le tableViewController à un UINavigationController d'abord, puis ajoutez le contrôleur de navigation comme l'élément rootViewController le beginRefreshing ne fonctionne plus. Par exemple

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:tableViewController];
self.viewController = navController;
self.window.rootViewController = self.viewController;

J'ai l'impression que cela a quelque chose à voir avec les hiérarchies de vues imbriquées dans le contrôleur de navigation qui ne sont pas compatibles avec le contrôle de rafraîchissement - des suggestions ?

Merci

11voto

Isaac Bosca Points 653

Pour Swift 4/4.1

Un mélange de réponses existantes fait l'affaire pour moi :

refreshControl.beginRefreshing()
tableView.setContentOffset(CGPoint(x: 0, y: tableView.contentOffset.y - (refreshControl.frame.size.height)), animated: true)

J'espère que cela vous aidera !

8voto

Peter Lapisu Points 3274

Voir aussi cette question

UIRefreshControl n'affiche pas d'épines lorsqu'il appelle beginRefreshing et que contentOffset est égal à 0

Il me semble qu'il s'agit d'un bug, car il ne se produit que lorsque la propriété contentOffset du tableView est égale à 0.

J'ai corrigé cela avec le code suivant (méthode pour le UITableViewController) :

- (void)beginRefreshingTableView {

    [self.refreshControl beginRefreshing];

    if (self.tableView.contentOffset.y == 0) {

        [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^(void){

            self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height);

        } completion:^(BOOL finished){

        }];

    }
}

7voto

Ghulam Rasool Points 1971

Voici Swift 3 et plus extension qui affiche le spinner et l'anime.

import UIKit
extension UIRefreshControl {

func beginRefreshingWithAnimation() {

    DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) {

        if let scrollView = self.superview as? UIScrollView {
            scrollView.setContentOffset(CGPoint(x: 0, y: scrollView.contentOffset.y - self.frame.height), animated: true)
          }
        self.beginRefreshing()
      }
   }
}

5voto

LukasHromadnik Points 167

Pour Swift 5, pour moi la seule chose qui manquait était d'appeler refreshControl.sendActions(.valueChanged) . J'ai fait une extension pour le rendre plus propre.

extension UIRefreshControl {

    func beginRefreshingManually() {
        if let scrollView = superview as? UIScrollView {
            scrollView.setContentOffset(CGPoint(x: 0, y: scrollView.contentOffset.y - frame.height), animated: false)
        }
        beginRefreshing()
        sendActions(for: .valueChanged)
    }

}

4voto

Meilbn Points 412

C'est parfait pour moi :

Swift 3 :

self.tableView.setContentOffset(CGPoint(x: 0, y: -self.refreshControl!.frame.size.height - self.topLayoutGuide.length), animated: true)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X