web-dev-qa-db-fra.com

Tirez pour actualiser UITableView sans UITableViewController

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

179
Daniel Robinson

Ajouter un contrôle d'actualisation directement à un UITableView sans utiliser un 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()
}
464
Berik

Objective-C :

Voici comment vous pouvez implémenter l'extraction pour actualiser la vue table. Identique à la vue collection. Il suffit de remplacer 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];
}
12
Manish Methani

Cette solution de @berik fonctionne bien, mais UIController est affiché en haut de UITableViewController. La façon de résoudre ce problème est de faire 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()
}
4
Andres

J'ai implémenté EGORefreshTableHeaderView avec un UIViewController et une vue sous forme de tableau. L'astuce est la suivante: dans les endroits où EGO prend une vue de défilement en tant que paramètre, si vous regardez la vue de table elle-même hérite de la vue de défilement.

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

J'espère que cela t'aides.