Tirez pour actualiser UITableView sans UITableViewController

180

J'essaie d'implémenter une fonctionnalité d'actualisation dans un UITableView dans un UIViewController. Je ne peux pas utiliser un UITableViewController parce que je veux que l'UITableView soit une sous-vue plus petite dans le contrôleur de vue, avec d'autres éléments au-dessus. Je suppose que c'est possible, mais est-ce que quelqu'un en a vu une mise en œuvre?

Daniel Robinson
la source

Réponses:

465

Ajoutez un contrôle d'actualisation directement à un UITableViewsans utiliser de UITableViewController:

override func viewDidLoad() {
    super.viewDidLoad()
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: #selector(refresh(_:)), for: .valueChanged)

    if #available(iOS 10.0, *) {
        tableView.refreshControl = refreshControl
    } else {
        tableView.backgroundView = refreshControl
    }
}

@objc func refresh(_ refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}
Berik
la source
1
Excellent et facile. Cela fonctionne pour moi lorsque je l'ai essayé sur une vue de table ajoutée à UIViewController sur iOS 7.0.4.
thandasoru
5
Quelqu'un at-il eu le problème où le contrôle lui-même n'est pas visible mais semble autrement fonctionner correctement?
télédistribution
16
La vue du tableau semble sauter de façon inattendue une fois qu'elle "clique". Je ne sais pas encore pourquoi.
Bob Spryn
3
J'ai trouvé qu'il doit aller dans viewdidappear, je ne sais pas si c'est une fonctionnalité iOS 7 - Je ne l'ai pas encore testé dans iOS 8 ...
Jack Solomon
4
Le refreshControl apparaît en haut de la tableView. J'ai corrigé cela par: tableView.insertSubview(refreshControl, atIndex: 0)au lieu detableView.addSubview(refreshControl)
kbpontius
12

Objectif-C :

C'est ainsi que vous pouvez implémenter pull pour actualiser la vue table. Idem que dans le cas de la vue collection. Remplacez simplement la vue de table alloc par la vue de collection.

UITableView *tableViewDemo  =  [[UITableView alloc]init];
tableViewDemo.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);
tableViewDemo.dataSource =  self;
tableViewDemo.delegate =  self;
[self.view addSubView: tableViewDemo];

UIRefreshControl *refreshController = [[UIRefreshControl alloc] init];
[refreshController addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[tableViewDemo addSubview:refreshController];

#pragma mark - Handle Refresh Method

-(void)handleRefresh : (id)sender
{
   NSLog (@"Pull To Refresh Method Called");
   [refreshController endRefreshing];
}
Manish Methani
la source
Comment la version obj-c n'a-t-elle que 9 votes positifs lorsque la version swift a> 430?
Chase Roberts
1
@ChaseRoberts, Celui-là a reçu une réponse le 13 février, jetez un œil à l'historique des modifications, à l'origine c'était dans objective-c, Puisque à cette époque, Swift était nouveau, tout le monde cherchait une version rapide ... stackoverflow.com/posts / 15010646 / revisions
Irfan
4

Cette solution de @berik fonctionne bien mais l'UIController est affiché au-dessus de UITableViewController. La façon de résoudre ce problème consiste à effectuer ce changement:

override func viewDidLoad() {
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged)
    tableView.backgroundView = refreshControl // <- THIS!!!
}

func refresh(refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}
Andrés
la source
3
Le refreshControl apparaît en haut de la tableView pour moi, mais votre suggestion fait refreshControldisparaître mon , pas apparaître sous le tableView. J'ai corrigé cela par: tableView.insertSubview (refreshControl, atIndex: 0) au lieu de tableView.addSubview (refreshControl)
kbpontius
3

J'ai implémenté EGORefreshTableHeaderView avec un UIViewController et une vue de table simple, l'astuce est que dans les endroits où EGO prend une vue de défilement comme paramètre, si vous regardez la vue de table elle-même hérite de la vue de défilement.

Cela ne nécessite que cela et quelques connexions supplémentaires :)

J'espère que cela t'aides.

Juan Alberto López Cavallotti
la source
-1

Il semble que si vous créez le UIRefreshControl dans la méthode loadView de viewController , tout fonctionne correctement . UIRefreshControl se comporte comme il se doit. Testé avec iOS 7.1 et iOS 8.2

Giannis Giannopoulos
la source
-1

J'ai fini par utiliser ODRefreshControl . Il n'a besoin d'aucun hack comme ci-dessus tableView.backgroundView = refreshControl, fonctionne presque de la même manière et donne une meilleure interface utilisateur.

Alex Bin Zhao
la source