¿Cómo usar pull para refrescar en Swift?

Estoy construyendo un lector de RSS usando swift y necesito implementar la function de recarga para recargar.

Así es como bash hacerlo.

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

Estoy obteniendo :

La propiedad 'self.refresh' no se inicializó en la llamada super.init

Por favor, ayúdame a comprender el comportamiento de los reconocedores de Gestos. Un código de muestra de trabajo será de gran ayuda.

Gracias.

Pull para actualizar está integrado en iOS. Podrías hacer esto rápidamente

 var refreshControl: UIRefreshControl! override func viewDidLoad() { super.viewDidLoad() refreshControl = UIRefreshControl() refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh") refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged) tableView.addSubview(refreshControl) // not requinetworking when using UITableViewController } func refresh(sender:AnyObject) { // Code to refresh table view } 

En algún momento podrías terminar refrescándote.

 refreshControl.endRefreshing() 

Una solución con storyboard y veloz …

1.) Abra su file .storyboard, select un TableViewController en su guión gráfico y "Habilite" la function Controlador de vista de tabla – Actualización en las Utilidades.

introduzca la descripción de la imagen aquí

2.) Abra el UITableViewController-Class asociado y agregue la siguiente línea en viewDidLoad-Method.

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

O en Swift 2.2:

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

3.) Agregue el siguiente método arriba del método viewDidLoad

 func refresh(sender:AnyObject) { // Updating your data here... self.tableView.reloadData() self.refreshControl?.endRefreshing() } 

Swift 3

 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) } func refresh(_ sender: Any) { // your code to refresh tableView } 

Y podrías dejar de refrescarse con:

 refreshControl.endRefreshing() 

iOS 10 / Swift 3

Me gustaría mencionar una característica PRETTY COOL que se incluye en iOS 10, que es:

Por ahora, UIRefreshControl es compatible directamente en cada uno de UICollectionView , UITableView y UIScrollView !

Cada una de estas vistas tiene la propiedad de instancia refreshControl , lo que significa que ya no es necesario agregarla como una subvista en su vista de desplazamiento , todo lo que tiene que hacer es:

 @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, me parece más natural tratarla como una propiedad para la vista de desplazamiento más que agregarla como una subvista, especialmente porque la única vista adecuada para ser una supervisión para un UIRefreshControl es una vista de desplazamiento, es decir, la funcionalidad de usar UIRefreshControl es solo útil cuando se trabaja con una vista de desplazamiento; Es por eso que este enfoque debería ser más obvio para configurar la vista de control de actualización.

La respuesta de Anhil me ayudó mucho.

Sin embargo, después de seguir experimentando, noté que la solución sugerida a veces causa una falla de UI no tan bonita.

En cambio, ir por este enfoque * hizo el truco para mí.

* 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 

En Swift usa esto,

Si quiere tener pull para actualizar en WebView,

Entonces pruebe este código:

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

Lo que le dice el error es que la refresh no se inicializa. Tenga en count que eligió hacer la refresh no opcional, que en Swift significa que debe tener un valor antes de llamar a super.init (o se llama implícitamente, lo que parece ser su caso). Realice la refresh opcional (probablemente lo que desee) o inicialícela de alguna manera.

Sugiero que vuelva a leer la documentation introductoria de Swift, que cubre esto en gran medida.

Una última cosa, que no es parte de la respuesta, como lo señaló @Anil, hay un command integrado para actualizar el control en iOS llamado UIRefresControl , que podría ser algo que vale la pena investigar.

Construí una aplicación de alimentación de RSS en la que tengo una function de actualización de extracción que originalmente tenía algunos de los problemas enumerados anteriormente.

Pero para agregar respuestas a los usuarios anteriores, estaba buscando en todas partes mi caso de uso y no pude encontrarlo. Estaba descargando datos de la web (RSSFeed) y quería bajar mi tabla de historias para actualizar.

Lo que se menciona anteriormente cubre las áreas correctas, pero con algunos de los problemas que tienen las personas, esto es lo que hice y funciona como un regalo:

Tomé el enfoque de @Blankarsch y fui a mi main.storyboard y seleccioné la vista de tabla para usar la actualización, entonces lo que no se mencionó es crear IBOutlet e IBAction para usar la actualización de manera eficiente

 //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 declanetworking it is already initailized. Got to love xcode refreshControl?.endRefreshing() } 

Sugiero hacer una extensión de pull To Refresh para usar en cada class.

1) Haga un file rápido y vacío: Archivo – Nuevo – Archivo – Archivo rápido.

2) Agregue los siguientes

  // 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) En su controller de vista, llame a estos methods como:

  override func viewWillAppear(animated: Bool) { self.makePullToRefreshToTableView(bidderListTable, triggerToMethodName: "pullToRefreshBidderTable") } 

4) En algún momento querías terminar la actualización:

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

puede usar esta subclass de 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: en el generador de interfaces, cambie la class de su tablaView a PullToRefreshTableView o cree un progtwig PullToRefreshTableView

2: implementar el PullToRefreshTableViewDelegate en el controller de vista

3 – tableViewDidStartRefreshing(tableView: PullToRefreshTableView) se llamará en su controller de vista cuando la vista de tabla comience a actualizarse

4: llame a yourTableView.endRefreshing() para finalizar la actualización

Así es como lo hice funcionar usando Xcode 7.2, que creo que es un error importante. Lo estoy usando dentro de UITableViewController dentro de mi viewWillAppear

 refreshControl = UIRefreshControl() refreshControl!.addTarget(self, action: "configureMessages", forControlEvents: .ValueChanged) refreshControl!.beginRefreshing() configureMessages() func configureMessages() { // configuring messages logic here self.refreshControl!.endRefreshing() } 

Como puede ver, literalmente tengo que llamar al método configureMessage() después de configurar mi UIRefreshControl , luego, las actualizaciones posteriores funcionarán bien.

Para la extracción para actualizar estoy usando

DGElasticPullToRefresh

https://github.com/gontovnik/DGElasticPullToRefresh

Instalación

pod 'DGElasticPullToRefresh'

 import DGElasticPullToRefresh 

y ponga esta function en su file rápido y llame a esta function desde su

override func viewWillAppear (_ animated: Bool)

  func Refresher() { let loadingView = DGElasticPullToRefreshLoadingViewCircle() loadingView.tintColor = UIColor(networking: 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(networking: 255.0/255.0, green: 57.0/255.0, blue: 66.0/255.0, alpha: 1)) self.table.dg_setPullToRefreshBackgroundColor(self.table.backgroundColor!) } 

Y no olvides eliminar la reference mientras que la vista desaparecerá.

Para eliminar la extracción para actualizar, ingrese este código en su

override func viewDidDisappear (_ animated: Bool)

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

Y se verá como

introduzca la descripción de la imagen aquí

Codificación feliz 🙂

Otras respuestas son correctas, pero para más detalles, verifique este post Tire para actualizar

Habilitar refrescar en Storyboard

Cuando está trabajando con un UITableViewController, la solución es bastante simple: Primero, select el controller de vista de tabla en su storyboard, abra el inspector de attributes y habilite la actualización:

Un UITableViewController viene equipado con una reference a un UIRefreshControl fuera de la caja. Simplemente necesita conectar algunas cosas para iniciar y completar la actualización cuando el usuario baja.

Reemplazar viewDidLoad ()

En la anulación de viewDidLoad (), agregue un destino para manejar la actualización de la siguiente manera:

 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. Puesto que he especificado "handleRefresh:" (¡observen los dos puntos!) Como el argumento de acción, necesito definir una function en esta class UITableViewController con el mismo nombre. Además, la function debe tomar un argumento
  2. Nos gustaría que se invocara esta acción para el UIControlEvent denominado ValueChanged
  3. No olvide llamar a refreshControl.endRefreshing()

Para más información, por favor, vaya a mencionar Enlace y todo el crédito va a esa publicación.