Tirare per aggiornare UITableView senza UITableViewController


180

Sto cercando di implementare una funzione pull to refresh in un UITableView all'interno di un UIViewController. Non riesco a usare un UITableViewController perché voglio che UITableView sia una subview più piccola nel controller di visualizzazione, con alcune altre cose sopra di esso. Presumo che ciò sia possibile, ma qualcuno ha visto una sua implementazione?

Risposte:


465

Aggiungi un controllo di aggiornamento direttamente a a UITableViewsenza usare a 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()
}

1
Eccellente e facile Funziona per me quando l'ho provato su una vista tabella aggiunta a UIViewController su iOS 7.0.4.
Thandasoru,

5
Qualcuno ha avuto il problema in cui il controllo stesso non è visibile ma altrimenti sembra funzionare bene?
remotevision

16
La vista tabella sembra saltare inaspettatamente quando "fa clic". Non so ancora perché.
Bob Spryn,

3
Ho scoperto che deve andare in viewdidappear, non sono sicuro che si tratti di una funzionalità iOS 7 - Devo ancora testarlo in iOS 8 ...
Jack Solomon

4
RefreshControl appare nella parte superiore di tableView. L'ho risolto con: tableView.insertSubview(refreshControl, atIndex: 0)anzichétableView.addSubview(refreshControl)
kbpontius il

12

Obiettivo-C :

Ecco come è possibile implementare pull per aggiornare per la vista tabella. Come nel caso della vista raccolta. Sostituisci semplicemente l'allocazione della vista tabella con la vista raccolta.

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];
}

In che modo la versione obj-c ha solo 9 voti positivi quando la versione rapida ha> 430?
Chase Roberts,

1
@ChaseRoberts, a cui viene data risposta il 13 febbraio, dai un'occhiata alla cronologia delle modifiche, originariamente era in obiettivo-c, poiché a quel tempo swift era nuovo, tutti cercavano una versione rapida ... stackoverflow.com/posts / 15010646 / revisioni
Irfan,

4

Questa soluzione di @berik funziona perfettamente, ma UIController è visualizzato sopra UITableViewController. Il modo per risolverlo sta facendo questo cambiamento:

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()
}

3
Il refreshControl appare nella parte superiore della tabellaVisualizza per me, ma il tuo suggerimento mi fa refreshControlscomparire, non appare sotto il tableView. Ho risolto questo problema con: tableView.insertSubview (refreshControl, atIndex: 0) invece di tableView.addSubview (refreshControl)
kbpontius,

3

Ho implementato EGORefreshTableHeaderView con un UIViewController e una semplice vista tabella, il trucco è che nei punti in cui EGO prende una vista di scorrimento come parametro, se guardi la vista di tabella stessa eredita dalla vista di scorrimento.

Richiede solo questo e alcune connessioni extra :)

Spero che questo ti aiuti.


-1

Sembra che se si crea l'UIRefreshControl all'interno del metodo loadView di viewController tutto funzioni correttamente . UIRefreshControl si comporta come dovrebbe. Testato con iOS 7.1 e iOS 8.2


-1

Ho finito per usare ODRefreshControl . Non ha bisogno di alcun hack come quello sopra tableView.backgroundView = refreshControl, funziona quasi allo stesso modo e offre un'interfaccia utente più bella.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.