¿Cómo usar pull para actualizar en Swift?

248

Estoy construyendo un lector de RSS con Swift y necesito implementar la funcionalidad de extracción para recargar.

Así es como estoy tratando de 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 que funcione será de gran ayuda.

Gracias.

xrage
fuente
Desea actualizar en la vista de tabla algo como techrepublic.com/blog/software-engineer/…
Anil Varghese
Sí, solo necesito esta funcionalidad, pero no tengo idea de ObjC. Desea implementar en rápido.
xrage

Respuestas:

591

Tire para actualizar está construido en iOS. Podrías hacer esto rápidamente

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  
}

En algún momento podrías terminar refrescando.

refreshControl.endRefreshing()
Anil Varghese
fuente
15
¡Gracias! Yo usé esto Solo algunos ajustes, para una carga lenta. Yo haría: "lazy var refreshControl = UIRefreshControl ()" Me parece una buena práctica evitar el desenvolvimiento forzado de las variables, ya que parece que derrota la seguridad del lenguaje.
nmdias
10
Solo una nota rápida, ni siquiera necesita agregar el refreshControl a la vista de tabla. Eso se maneja implícitamente.
Kendrick Ledet
1
@KendrickLedet incluso si no usa un UITableViewController?
Van Du Tran
3
¿Cómo podría utilizar esta solución para la parte superior de la vista de tabla y en la parte inferior?
AustinT
3
Actualización de Swift 4: refreshControl.addTarget (self, action: "refresh:", for: .valueChanged)
akseli
148

Una solución con storyboard y rápida ...

1.) Abra su archivo .storyboard, seleccione un TableViewController en su storyboard y "Habilite" el Table View Controller - Función de actualización en las Utilidades.

ingrese la descripción de la imagen aquí

2.) Abra la clase UITableViewController asociada y agregue la siguiente línea en el método viewDidLoad.

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

Editado para Swift 5.0:

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

O en Swift 2.2:

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

3.) Agregue el siguiente método sobre viewDidLoad-Method

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

    self.tableView.reloadData()
    self.refreshControl?.endRefreshing()
}
Blanco
fuente
77
también, puede agregar acción de actualización con el guión gráfico al arrastrar el control desde Actualizar control en el guión gráfico a su ViewController
uiureo
Si mis datos de carga son asíncronos, ¿debería put self.tableView.reloadData()y self.refreshControl?.endRefreshing()en la devolución de llamada?
Qian Chen
¡Exactamente! Y ponlo reloadData()en la cola principal para actualizar tu IU al instante: dispatch_async(dispatch_get_main_queue(),{ self.tableView.reloadData() });
blanco el
1
De esta manera se prefirió la respuesta aceptada por la razón de que no hay errores de diseño (al menos para mí usando swift 2+)
Ryan Walton
1
Esta respuesta debería tener la mayor cantidad de votos y ser la respuesta correcta
krummens
75

Me gustaría mencionar una característica PRETTY COOL que se ha incluido desde iOS 10, que es:

Por ahora, UIRefreshControl es directamente compatible con cada uno de UICollectionView, UITableViewy 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, considero que es más natural tratarlo como una propiedad para la vista de desplazamiento más que agregarlo como una subvista, especialmente porque la única vista apropiada para ser una supervista 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.

Sin embargo, todavía tiene la opción de usar el addSubviewbasado en la versión de iOS:

if #available(iOS 10.0, *) {
  collectionView.refreshControl = refreshControl
} else {
  collectionView.addSubview(refreshControl)
}
Ahmad F
fuente
Hola hombre, ¿a qué llamo en la función doSomething? si llamo reload.Data no quiere cargar de nuevo!
@JavierV. agregue un punto de interrupción en la doSomethingfunción, si es accesible, entonces debe verificar su código.
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
}

Y podrías dejar de refrescarte con:

refreshControl.endRefreshing()
Gilad Brunfman
fuente
¡No olvides mencionar tableView.reloadData()en tu ejemplo!
Konstantinos Natsios
Hola Creo mi refreshcontrol de esa manera: 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 }. Luego llame a endRefreshing (), no funciona (el control de actualización todavía se muestra allí), pero siga su camino, funcionó, por favor, avíseme por qué.
lee
@lee Porque rfControl es local y no tiene acceso desde afuera. Intente inicializar rfControl como una variable global para el VC: var rfControl = UIRefreshControl (), y pare con rfControl.endRefreshing ()
Gilad Brunfman
Una pregunta: ¿dónde .valueChangedse desencadena el evento? No entiendo esta conexión.
juniorgarcia
cuando se activa UIRefreshControl, como puede ver cuando agregaTarget: refreshControl.addTarget (self, action: #selector (self.refresh), for: UIControlEvents.valueChanged)
Gilad Brunfman
9

En Swift usa esto,

Si desea tener pull para actualizar en WebView,

Entonces prueba 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()
}
Mohammad Zaid Pathan
fuente
¡Gracias Señor! Resuelto el problema de un novato que he tenido mientras aprendía.
Adrian David Smith
5

La respuesta de Anhil me ayudó mucho.

Sin embargo, después de experimentar más, noté que la solución sugerida a veces causa un problema de interfaz de usuario no tan bonito .

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
Leverin
fuente
2

Lo que te dice el error es que refreshno está inicializado. Tenga en cuenta que eligió para que refreshno opcional, que en los medios de Swift que tiene que tener un valor antes de llamar a super.init(o se llama de forma implícita, que parece ser el caso). Haga refreshopcional (probablemente lo que desee) o inicialícelo de alguna manera.

Sugeriría leer nuevamente la documentación introductoria de Swift, que cubre esto en gran extensión.

Una última cosa, que no forma parte de la respuesta, como señaló @Anil, hay un tirón incorporado para actualizar el control en iOS llamado UIRefresControl, que podría ser algo que valga la pena analizar.

JustSid
fuente
2

Creé una aplicación de fuente RSS en la que tengo una actualización de Pull To función de que originalmente tenía algunos de los problemas enumerados anteriormente.

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

Lo que se mencionó anteriormente cubre las áreas correctas, pero con algunos de los problemas que tiene la gente, esto es lo que hice y funciona:

Tomé el enfoque de @Blankarsch y fui a mi main.storyboard y seleccioné la vista de tabla para usar la actualización, luego 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 declared it is already initailized. Got to love xcode
  refreshControl?.endRefreshing()
}

Espero que esto ayude a cualquiera en la misma situación que yo

Dom Bryan
fuente
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()
}
contratar
fuente
2

Detalles

  • Xcode versión 10.3 (10G8), Swift 5

Caracteristicas

  • Capacidad para hacer "extraer para actualizar" mediante programación
  • Protección contra múltiples eventos de "extracción para actualizar"
  • Capacidad para continuar animando el indicador de actividad cuando se cambia el controlador de vista (por ejemplo, en el caso de TabController)

Solución

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

Muestra completa

No olvides agregar el código de la solución aquí

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()
    }
}
Vasily Bodnarchuk
fuente
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
    }
Gurjinder Singh
fuente
1

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

1) Cree un archivo swift vacío: Archivo - Nuevo - Archivo - Archivo Swift.

2) Agregue lo siguiente

    //  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 controlador de vista llame a estos métodos como:

  override func viewWillAppear(animated: Bool) {

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

4) En algún momento quisiste terminar la actualización:

  func pullToRefreshBidderTable() {
self.makePullToRefreshEndRefreshing("bidderListTable")    
//Code What to do here.
}
OR    
self.makePullToRefreshEndRefreshing("bidderListTable")
AG
fuente
1
Su código es con el nombre del proyecto y el aviso de copyright, puede que no sea bueno para usted :). Cualquier código que publique aquí debería ser gratuito para todos
Anil Varghese
Gracias Anil! Olvidé quitarlos.
AG
1

Para el tirón para actualizar estoy usando

DGElasticPullToRefresh

https://github.com/gontovnik/DGElasticPullToRefresh

Instalación

pod 'DGElasticPullToRefresh'

import DGElasticPullToRefresh

y ponga esta función en su archivo rápido y llame a esta función desde su

anular función viewWillAppear (_ animado: 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!)
 }

Y no olvide eliminar la referencia mientras la vista desaparecerá

para eliminar pull para actualizar, ponga este código en su

anular func viewDidDisappear (_ animated: Bool)

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

 }

Y se verá como

ingrese la descripción de la imagen aquí

Feliz codificación :)

Azharhussain Shaikh
fuente
1

Puede lograr esto usando pocas líneas de código. Entonces, ¿por qué vas a estar atascado en la biblioteca de terceros o la interfaz de usuario? Tire para actualizar está construido en iOS. Podrías hacer esto rápidamente

ingrese la descripción de la imagen aquí

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  
}
Sr. Javed Multani
fuente
0

puedes usar esta subclase 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 creador de interfaces, cambie la clase de su tableView ao PullToRefreshTableViewcree un PullToRefreshTableViewprograma

2 - implemente el PullToRefreshTableViewDelegateen su controlador de vista

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

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

Chuy47
fuente
0

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

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 configureMessage()método después de configurar mi UIRefreshControl, luego de eso, las actualizaciones posteriores funcionarán bien.

jaytrixz
fuente
-1

Otras respuestas son correctas, pero para obtener más detalles, consulte esta publicación Tire para actualizar

Habilitar la actualización en Storyboard

Cuando trabajas con un UITableViewController, la solución es bastante simple: primero, selecciona el controlador de vista de tabla en tu guión gráfico, abre el inspector de atributos y habilita la actualización:

Un UITableViewController viene equipado con una referencia a un UIRefreshControl listo para usar. Simplemente necesita conectar algunas cosas para iniciar y completar la actualización cuando el usuario se retira.

Invalidar viewDidLoad ()

En su reemplazo 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. Como he especificado "handleRefresh:" (¡tenga en cuenta los dos puntos!) Como argumento de acción, necesito definir una función en esta clase UITableViewController con el mismo nombre. Además, la función debe tomar un argumento
  2. Nos gustaría que esta acción se llame para el UIControlEvent llamado ValueChanged
  3. No olvides llamar refreshControl.endRefreshing()

Para obtener más información, vaya a mencionar Link y todo el crédito va a esa publicación

Singhak
fuente
Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
Tunaki