Come utilizzare pull per aggiornare in Swift?


248

Sto costruendo un lettore RSS usando swift e ho bisogno di implementare la funzionalità pull per ricaricare.

Ecco come sto cercando di farlo.

class FirstViewController: UIViewController,
    UITableViewDelegate, UITableViewDataSource {

   @IBOutlet var refresh: UIScreenEdgePanGestureRecognizer
   @IBOutlet var newsCollect: UITableView

   var activityIndicator:UIActivityIndicatorView? = nil

   override func viewDidLoad() {
       super.viewDidLoad()
       self.newsCollect.scrollEnabled = true
      // Do any additional setup after loading the view, typically from a nib.

      if nCollect.news.count <= 2{
          self.collectNews()
       }
      else{
          self.removeActivityIndicator()
       }
      view.addGestureRecognizer(refresh)
   }



@IBAction func reload(sender: UIScreenEdgePanGestureRecognizer) {
    nCollect.news = News[]()
    return newsCollect.reloadData()
}

Ricevo:

Proprietà 'self.refresh' non inizializzata alla chiamata super.init

Ti prego, aiutami a capire il comportamento dei riconoscitori di gesti. Un codice di esempio funzionante sarà di grande aiuto.

Grazie.


Vuoi tirare per aggiornare in vista tabella qualcosa come techrepublic.com/blog/software-engineer/…
Anil Varghese,

Sì, ho bisogno solo di questa funzionalità ma non ho idea di ObjC. Vuoi implementare rapidamente.
xrage,

Risposte:


591

Pull to refresh è integrato in iOS. Potresti farlo in fretta come

var refreshControl = UIRefreshControl()

override func viewDidLoad() {
   super.viewDidLoad()

   refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
   refreshControl.addTarget(self, action: #selector(self.refresh(_:)), for: .valueChanged)
   tableView.addSubview(refreshControl) // not required when using UITableViewController
}

@objc func refresh(_ sender: AnyObject) {
   // Code to refresh table view  
}

Ad un certo punto potresti finire di rinfrescarti.

refreshControl.endRefreshing()

15
Grazie! Ho usato questo Solo alcune modifiche, per un caricamento lento. Vorrei fare: "lazy var refreshControl = UIRefreshControl ()" Trovo che sia una buona pratica evitare di scartare forzatamente le variabili, poiché sembra che sconfigga la sicurezza del linguaggio.
nmdias,

10
Solo una breve nota, non è nemmeno necessario aggiungere refreshControl alla tabella. Questo è gestito implicitamente.
Kendrick Ledet,

1
@KendrickLedet anche se non usi UITableViewController?
Van Du Tran,

3
Come potrei usare questa soluzione per la parte superiore della vista tabella e per quella inferiore?
Austin,

3
Aggiornamento Swift 4: refreshControl.addTarget (self, azione: "refresh:", per: .valueChanged)
akseli

149

Una soluzione con storyboard e rapido ...

1.) Apri il tuo file .storyboard, seleziona un TableViewController nello storyboard e "Abilita" il Table View Controller - Funzione di aggiornamento nelle Utilità.

inserisci qui la descrizione dell'immagine

2.) Aprire la classe UITableViewController associata e aggiungere la seguente riga nel metodo viewDidLoad.

self.refreshControl?.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)

Modificato per Swift 5.0:

self.refreshControl?.addTarget(self, action: #selector(refresh), for: UIControl.Event.valueChanged)

OPPURE in Swift 2.2:

self.refreshControl?.addTarget(self, action: #selector(TestTableViewController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged)

3.) Aggiungere il seguente metodo sopra il metodo viewDidLoad

func refresh(sender:AnyObject)
{
    // Updating your data here...

    self.tableView.reloadData()
    self.refreshControl?.endRefreshing()
}

7
inoltre, puoi aggiungere un'azione di aggiornamento con lo storyboard trascinando il controllo da Aggiorna controllo nello storyboard al
ViewController

Se i miei dati di caricamento sono asincroni, dovrei put self.tableView.reloadData()e self.refreshControl?.endRefreshing()nel callback?
Qian Chen,

Esattamente! E inseriscilo reloadData()nella coda principale per aggiornare immediatamente l'interfaccia utente: dispatch_async(dispatch_get_main_queue(),{ self.tableView.reloadData() });
Blank

1
In questo modo è stato preferito rispetto alla risposta accettata per il motivo che non ci sono bug di layout (almeno per me usando swift 2+)
Ryan Walton,

1
Questa risposta dovrebbe avere il maggior numero di voti ed essere la risposta corretta
krummens

75

Vorrei citare un ABBASTANZA FRESCO che è stata inclusa da iOS 10, che è:

Per ora, UIRefreshControl è direttamente supportato in ciascuna UICollectionView, UITableVieweUIScrollView !

Ognuna di queste viste ha la proprietà dell'istanza di refreshControl , il che significa che non è più necessario aggiungerla come vista secondaria nella vista di scorrimento , tutto ciò che devi fare è:

@IBOutlet weak var collectionView: UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()

    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: #selector(doSomething), for: .valueChanged)

    // this is the replacement of implementing: "collectionView.addSubview(refreshControl)"
    collectionView.refreshControl = refreshControl
}

func doSomething(refreshControl: UIRefreshControl) {
    print("Hello World!")

    // somewhere in your code you might need to call:
    refreshControl.endRefreshing()
}

Personalmente, trovo più naturale trattarlo come una proprietà per la vista di scorrimento piuttosto che aggiungerlo come una sottoview, soprattutto perché l'unica vista appropriata per essere una superview per un UIRefreshControl è una vista di scorrimento, cioè la funzionalità dell'uso di UIRefreshControl è solo utile quando si lavora con una vista di scorrimento; Ecco perché questo approccio dovrebbe essere più ovvio per impostare la vista di controllo dell'aggiornamento.

Tuttavia, hai ancora la possibilità di utilizzare il addSubviewbasato sulla versione iOS:

if #available(iOS 10.0, *) {
  collectionView.refreshControl = refreshControl
} else {
  collectionView.addSubview(refreshControl)
}

ehi amico, come chiamo la funzione doSomething? se chiamo reload.Data non vuole caricarlo di nuovo!

@JavierV. aggiungere un punto di interruzione nella doSomethingfunzione, se è raggiungibile, è necessario verificare il codice.
Ahmad F,

50

Swift 4

var refreshControl: UIRefreshControl!

override func viewDidLoad() {
    super.viewDidLoad()

    refreshControl = UIRefreshControl()
    refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
    refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
    tableView.addSubview(refreshControl) 
}

@objc func refresh(_ sender: Any) {
    //  your code to reload tableView
}

E potresti smettere di rinfrescarti con:

refreshControl.endRefreshing()

Non dimenticare di menzionare tableView.reloadData()nel tuo esempio!
Konstantinos Natsios,

Ciao Creo il mio refreshcontrol per quella via: var refControl: UIRefreshControl{ let rfControl = UIRefreshControl() rfControl.attributedTitle = NSAttributedString(string: "") rfControl.tintColor = UIColor(red:0.16, green:0.68, blue:0.9, alpha:1) rfControl.addTarget(self, action: #selector(getNewMessageList), for: .valueChanged) return rfControl }. Quindi chiama endRefreshing (), non funziona (il refreshcontrol mostra ancora lì), ma segui la tua strada, ha funzionato, per favore fammi sapere perché?
sottovento il

@lee Perché rfControl è locale e non ha accesso da fuori. Prova a inizializzare rfControl come variabile globale nel VC: var rfControl = UIRefreshControl () e termina con rfControl.endRefreshing ()
Gilad Brunfman

Una domanda: dove .valueChangedviene attivato l' evento? Non capisco questa connessione.
juniorgarcia,

quando viene attivato UIRefreshControl, come vedi quando aggiungiTarget: refreshControl.addTarget (self, action: #selector (self.refresh), per: UIControlEvents.valueChanged)
Gilad Brunfman,

9

In Swift usa questo,

Se vuoi avere pull per aggiornare in WebView,

Quindi prova questo codice:

override func viewDidLoad() {
    super.viewDidLoad()
    addPullToRefreshToWebView()
}

func addPullToRefreshToWebView(){
    var refreshController:UIRefreshControl = UIRefreshControl()

    refreshController.bounds = CGRectMake(0, 50, refreshController.bounds.size.width, refreshController.bounds.size.height) // Change position of refresh view
    refreshController.addTarget(self, action: Selector("refreshWebView:"), forControlEvents: UIControlEvents.ValueChanged)
    refreshController.attributedTitle = NSAttributedString(string: "Pull down to refresh...")
    YourWebView.scrollView.addSubview(refreshController)

}

func refreshWebView(refresh:UIRefreshControl){
    YourWebView.reload()
    refresh.endRefreshing()
}

Grazie Signore! Risolto il problema di un noob che ho avuto durante l'apprendimento.
Adrian David Smith,

5

La risposta di Anhil mi ha aiutato molto.

Tuttavia, dopo aver sperimentato ulteriormente, ho notato che la soluzione suggerita a volte provoca un'interruzione dell'interfaccia utente non così carina .

Invece, seguire questo approccio * ha fatto il trucco per me.

* Swift 2.1

//Create an instance of a UITableViewController. This will host your UITableView.
private let tableViewController = UITableViewController()

//Add tableViewController as a childViewController and set its tableView property to your UITableView.
self.addChildViewController(self.tableViewController)
self.tableViewController.tableView = self.tableView
self.refreshControl.addTarget(self, action: "refreshData:", forControlEvents: .ValueChanged)
self.tableViewController.refreshControl = self.refreshControl

2

Quello che l'errore ti sta dicendo è che refreshnon è inizializzato. Nota che hai scelto di refreshnon rendere facoltativo, il che in Swift significa che deve avere un valore prima di chiamare super.init(o viene chiamato implicitamente, che sembra essere il tuo caso). O farerefresh facoltativo (probabilmente quello che vuoi) o inizializzalo in qualche modo.

Suggerirei di leggere di nuovo la documentazione introduttiva di Swift, che tratta questo in modo approfondito.

Un'ultima cosa, non parte della risposta, come sottolineato da @Anil, c'è un pull integrato per aggiornare il controllo in iOS chiamato UIRefresControl, che potrebbe essere qualcosa che vale la pena esaminare.


2

Ho creato un'app di feed RSS in cui ho un Pull To refresh che originariamente aveva alcuni dei problemi sopra elencati.

Ma per aggiungere alle risposte degli utenti sopra, stavo cercando ovunque il mio caso d'uso e non riuscivo a trovarlo. Stavo scaricando i dati dal Web (RSSFeed) e volevo aprire il mio tavolo Visualizza le storie da aggiornare.

Ciò che è menzionato sopra copre le aree giuste ma con alcuni dei problemi che le persone hanno, ecco cosa ho fatto e funziona a meraviglia:

Ho seguito l'approccio di @Blankarsch e sono andato al mio main.storyboard e ho selezionato la vista tabella per utilizzare l'aggiornamento, quindi ciò che non è stato menzionato è creare IBOutlet e IBAction per utilizzare l'aggiornamento in modo efficiente

//Created from main.storyboard cntrl+drag refresh from left scene to assistant editor
@IBOutlet weak var refreshButton: UIRefreshControl

override func viewDidLoad() {
  ...... 
  ......
  //Include your code
  ......
  ......
  //Is the function called below, make sure to put this in your viewDidLoad 
  //method or not data will be visible when running the app
  getFeedData()
}

//Function the gets my data/parse my data from the web (if you havnt already put this in a similar function)
//remembering it returns nothing, hence return type is "-> Void"
func getFeedData() -> Void{
  .....
  .....
}

//From main.storyboard cntrl+drag to assistant editor and this time create an action instead of outlet and 
//make sure arguments are set to none and note sender
@IBAction func refresh() {
  //getting our data by calling the function which gets our data/parse our data
  getFeedData()

  //note: refreshControl doesnt need to be declared it is already initailized. Got to love xcode
  refreshControl?.endRefreshing()
}

Spero che questo aiuti chiunque sia nella mia stessa situazione


2
func pullToRefresh(){

    let refresh = UIRefreshControl()
    refresh.addTarget(self, action: #selector(handleTopRefresh(_:)), for: .valueChanged )
    refresh.tintColor = UIColor.appBlack
    self.tblAddressBook.addSubview(refresh)

}
@objc func handleTopRefresh(_ sender:UIRefreshControl){
    self.callAddressBookListApi(isLoaderRequired: false)
    sender.endRefreshing()
}

2

Dettagli

  • Xcode versione 10.3 (10G8), Swift 5

Caratteristiche

  • Possibilità di effettuare "pull to refresh" a livello di codice
  • Protezione da eventi "pull to refresh" multipli
  • Possibilità di continuare l'animazione dell'indicatore di attività quando viene visualizzato il controller (ad esempio nel caso di TabController)

Soluzione

import UIKit

class RefreshControl: UIRefreshControl {

    private weak var actionTarget: AnyObject?
    private var actionSelector: Selector?
    override init() { super.init() }

    convenience init(actionTarget: AnyObject?, actionSelector: Selector) {
        self.init()
        self.actionTarget = actionTarget
        self.actionSelector = actionSelector
        addTarget()
    }

    private func addTarget() {
        guard let actionTarget = actionTarget, let actionSelector = actionSelector else { return }
        addTarget(actionTarget, action: actionSelector, for: .valueChanged)
    }

    required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) }

    func endRefreshing(deadline: DispatchTime? = nil) {
        guard let deadline = deadline else { endRefreshing(); return }
        DispatchQueue.global(qos: .default).asyncAfter(deadline: deadline) { [weak self] in
            DispatchQueue.main.async { self?.endRefreshing() }
        }
    }

    func refreshActivityIndicatorView() {
        guard let selector = actionSelector else { return }
        let _isRefreshing = isRefreshing
        removeTarget(actionTarget, action: selector, for: .valueChanged)
        endRefreshing()
        if _isRefreshing { beginRefreshing() }
        addTarget()
    }

    func generateRefreshEvent() {
        beginRefreshing()
        sendActions(for: .valueChanged)
    }
}

public extension UIScrollView {

    private var _refreshControl: RefreshControl? { return refreshControl as? RefreshControl }

    func addRefreshControll(actionTarget: AnyObject?, action: Selector, replaceIfExist: Bool = false) {
        if !replaceIfExist && refreshControl != nil { return }
        refreshControl = RefreshControl(actionTarget: actionTarget, actionSelector: action)
    }

    func scrollToTopAndShowRunningRefreshControl(changeContentOffsetWithAnimation: Bool = false) {
        _refreshControl?.refreshActivityIndicatorView()
        guard   let refreshControl = refreshControl,
                contentOffset.y != -refreshControl.frame.height else { return }
        setContentOffset(CGPoint(x: 0, y: -refreshControl.frame.height), animated: changeContentOffsetWithAnimation)
    }

    private var canStartRefreshing: Bool {
        guard let refreshControl = refreshControl, !refreshControl.isRefreshing else { return false }
        return true
    }

    func startRefreshing() {
        guard canStartRefreshing else { return }
        _refreshControl?.generateRefreshEvent()
    }

    func pullAndRefresh() {
        guard canStartRefreshing else { return }
        scrollToTopAndShowRunningRefreshControl(changeContentOffsetWithAnimation: true)
        _refreshControl?.generateRefreshEvent()
    }

    func endRefreshing(deadline: DispatchTime? = nil) { _refreshControl?.endRefreshing(deadline: deadline) }
}

uso

// Add refresh control to UICollectionView / UITableView / UIScrollView
private func setupTableView() {
    let tableView = UITableView()
    // ...
    tableView.addRefreshControll(actionTarget: self, action: #selector(refreshData))
}

@objc func refreshData(_ refreshControl: UIRefreshControl) {
    tableView?.endRefreshing(deadline: .now() + .seconds(3))
}

// Stop refreshing in UICollectionView / UITableView / UIScrollView
tableView.endRefreshing()

// Simulate pull to refresh in UICollectionView / UITableView / UIScrollView
tableView.pullAndRefresh()

Campione completo

Non dimenticare di aggiungere qui il codice della soluzione

import UIKit

class ViewController: UIViewController {

    private weak var tableView: UITableView?

    override func viewDidLoad() {
        super.viewDidLoad()
        setupTableView()
    }

    private func setupTableView() {
        let tableView = UITableView()
        view.addSubview(tableView)
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        tableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        tableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        tableView.dataSource = self
        tableView.delegate = self
        tableView.addRefreshControll(actionTarget: self, action: #selector(refreshData))
        self.tableView = tableView
    }
}

extension ViewController {
    @objc func refreshData(_ refreshControl: UIRefreshControl) {
        print("refreshing")
        tableView?.endRefreshing(deadline: .now() + .seconds(3))
    }
}

extension ViewController: UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int { return 1 }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 20 }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.textLabel?.text = "\(indexPath)"
        return cell
    }
}

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.pullAndRefresh()
    }
}

2

Swift 5

private var pullControl = UIRefreshControl()

pullControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
        pullControl.addTarget(self, action: #selector(refreshListData(_:)), for: .valueChanged)
        if #available(iOS 10.0, *) {
            tableView.refreshControl = pullControl
        } else {
            tableView.addSubview(pullControl)
        }
// Actions
@objc private func refreshListData(_ sender: Any) {
        self.pullControl.endRefreshing() // You can stop after API Call
        // Call API
    }

1

Suggerisco di fare un'estensione di pull To Refresh da usare in ogni classe.

1) Crea un file swift vuoto: File - Nuovo - File - File Swift.

2) Aggiungi quanto segue

    //  AppExtensions.swift

    import Foundation
    import UIKit    

    var tableRefreshControl:UIRefreshControl = UIRefreshControl()    

    //MARK:- VIEWCONTROLLER EXTENSION METHODS
    public extension UIViewController
    {
        func makePullToRefreshToTableView(tableName: UITableView,triggerToMethodName: String){

            tableRefreshControl.attributedTitle = NSAttributedString(string: "TEST: Pull to refresh")
            tableRefreshControl.backgroundColor = UIColor.whiteColor()
            tableRefreshControl.addTarget(self, action: Selector(triggerToMethodName), forControlEvents: UIControlEvents.ValueChanged)
            tableName.addSubview(tableRefreshControl)
        }
        func makePullToRefreshEndRefreshing (tableName: String)
        {
            tableRefreshControl.endRefreshing()
//additional codes

        }
    }    

3) In Your View Controller chiama questi metodi come:

  override func viewWillAppear(animated: Bool) {

self.makePullToRefreshToTableView(bidderListTable, triggerToMethodName: "pullToRefreshBidderTable")
}

4) Ad un certo punto volevi terminare l'aggiornamento:

  func pullToRefreshBidderTable() {
self.makePullToRefreshEndRefreshing("bidderListTable")    
//Code What to do here.
}
OR    
self.makePullToRefreshEndRefreshing("bidderListTable")

1
Il tuo codice è con nome del progetto e avviso sul copyright, potrebbe non essere buono per te :). Qualunque codice tu abbia pubblicato qui dovrebbe essere gratuito per tutti
Anil Varghese,

Grazie Anil! Ho dimenticato di rimuovere quelli.
AG

1

Per il tiro per aggiornare sto usando

DGElasticPullToRefresh

https://github.com/gontovnik/DGElasticPullToRefresh

Installazione

pod "DGElasticPullToRefresh"

import DGElasticPullToRefresh

e inserisci questa funzione nel tuo file rapido e chiama questa funzione dal tuo

override func viewWillAppear (_ animato: Bool)

     func Refresher() {
      let loadingView = DGElasticPullToRefreshLoadingViewCircle()
      loadingView.tintColor = UIColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1.0)
      self.table.dg_addPullToRefreshWithActionHandler({ [weak self] () -> Void in

          //Completion block you can perfrom your code here.

           print("Stack Overflow")

           self?.table.dg_stopLoading()
           }, loadingView: loadingView)
      self.table.dg_setPullToRefreshFillColor(UIColor(red: 255.0/255.0, green: 57.0/255.0, blue: 66.0/255.0, alpha: 1))
      self.table.dg_setPullToRefreshBackgroundColor(self.table.backgroundColor!)
 }

E non dimenticare di rimuovere il riferimento mentre la vista non sarà più visualizzata

per rimuovere pull per aggiornare inserisci questo codice nel tuo

override func viewDidDisappear (_ animato: Bool)

override func viewDidDisappear(_ animated: Bool) {
      table.dg_removePullToRefresh()

 }

E sembrerà

inserisci qui la descrizione dell'immagine

Buona programmazione :)


1

È possibile ottenere ciò utilizzando poche righe di codice. Quindi perché rimarrai bloccato nella libreria o nell'interfaccia utente di terze parti. Pull to refresh è integrato in iOS. Potresti farlo in fretta come

inserisci qui la descrizione dell'immagine

var pullControl = UIRefreshControl()

override func viewDidLoad() {
   super.viewDidLoad()

   pullControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
   pullControl.addTarget(self, action: #selector(pulledRefreshControl(_:)), for: UIControl.Event.valueChanged)
   tableView.addSubview(pullControl) // not required when using UITableViewController
}

@objc func pulledRefreshControl(sender:AnyObject) {
   // Code to refresh table view  
}

0

puoi usare questa sottoclasse di tableView:

import UIKit

protocol PullToRefreshTableViewDelegate : class {
    func tableViewDidStartRefreshing(tableView: PullToRefreshTableView)
}

class PullToRefreshTableView: UITableView {

    @IBOutlet weak var pullToRefreshDelegate: AnyObject?
    private var refreshControl: UIRefreshControl!
    private var isFirstLoad = true

    override func willMoveToSuperview(newSuperview: UIView?) {
        super.willMoveToSuperview(newSuperview)

        if (isFirstLoad) {
            addRefreshControl()
            isFirstLoad = false
        }
    }

    private func addRefreshControl() {
        refreshControl = UIRefreshControl()
        refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
        refreshControl.addTarget(self, action: "refresh", forControlEvents: .ValueChanged)
        self.addSubview(refreshControl)
    }

    @objc private func refresh() {
       (pullToRefreshDelegate as? PullToRefreshTableViewDelegate)?.tableViewDidStartRefreshing(self)
    }

    func endRefreshing() {
        refreshControl.endRefreshing()
    }

}

1 - in Interface Builder cambiare la classe del vostro tableView per PullToRefreshTableViewo creare una PullToRefreshTableViewprogrammazione

2 - implementa il PullToRefreshTableViewDelegatecontroller nel tuo view

3 - tableViewDidStartRefreshing(tableView: PullToRefreshTableView)verrà chiamato nel controller della vista quando la vista della tabella inizia l'aggiornamento

4 - chiama yourTableView.endRefreshing()per terminare l'aggiornamento


0

Questo è il modo in cui l'ho fatto funzionare usando Xcode 7.2 che penso sia un grosso bug. Lo sto usando UITableViewControllerdentro di meviewWillAppear

refreshControl = UIRefreshControl()
refreshControl!.addTarget(self, action: "configureMessages", forControlEvents: .ValueChanged)
refreshControl!.beginRefreshing()

configureMessages()

func configureMessages() {
    // configuring messages logic here

    self.refreshControl!.endRefreshing()
}

Come puoi vedere, devo letteralmente chiamare il configureMessage()metodo dopo aver impostato il mio, UIRefreshControlquindi dopo, i successivi aggiornamenti funzioneranno bene.


-1

Altre risposte sono corrette, ma per maggiori dettagli controlla questo messaggio Pull to Refresh

Abilita aggiornamento in Storyboard

Quando lavori con un UITableViewController, la soluzione è abbastanza semplice: in primo luogo, seleziona il controller di visualizzazione tabella nello storyboard, apri la finestra di ispezione degli attributi e abilita l'aggiornamento:

Un UITableViewController viene fornito con un riferimento a un UIRefreshControl pronto all'uso. Devi semplicemente collegare alcune cose per avviare e completare l'aggiornamento quando l'utente tira giù.

Sostituisci viewDidLoad ()

Nella sostituzione di viewDidLoad (), aggiungi una destinazione per gestire l'aggiornamento come segue:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
        
    self.refreshControl?.addTarget(self, action: "handleRefresh:", forControlEvents: UIControlEvents.ValueChanged)
}
  1. Dato che ho specificato "handleRefresh:" (notare i due punti!) Come argomento dell'azione, ho bisogno di definire una funzione in questa classe UITableViewController con lo stesso nome. Inoltre, la funzione dovrebbe accettare un argomento
  2. Vorremmo che questa azione fosse chiamata per UIControlEvent chiamato ValueChanged
  3. Non dimenticare di chiamare refreshControl.endRefreshing()

Per maggiori informazioni, vai a menzionare Link e tutto il credito va a quel post


Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento.
Tunaki
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.