Como usar o pull para atualizar no Swift?

247

Estou construindo um leitor de RSS usando o swift e preciso implementar pull para recarregar a funcionalidade.

Aqui está como eu estou tentando fazer isso.

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

Estou obtendo :

A propriedade 'self.refresh' não foi inicializada na chamada super.init

Por favor, ajude-me a entender o comportamento dos reconhecedores de gestos. Um código de exemplo funcional será uma grande ajuda.

Obrigado.

xrage
fonte
Você quer puxar para refrescar no tableview alguma coisa como techrepublic.com/blog/software-engineer/...
Anil Varghese
Sim, preciso apenas dessa funcionalidade, mas não tenho idéia do ObjC. Deseja implementar rapidamente.
xrage

Respostas:

590

Puxe para atualizar é construído no iOS. Você poderia fazer isso rapidamente

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  
}

Em algum momento você pode terminar de atualizar.

refreshControl.endRefreshing()
Anil Varghese
fonte
15
Obrigado! Eu usei isso. Apenas alguns ajustes, para carregamento lento. Eu faria: "preguiçoso var refreshControl = UIRefreshControl ()" Acho uma boa prática evitar o desempacotamento forçado de variáveis, pois parece que isso prejudica a segurança do idioma.
Ndias
10
Apenas uma observação rápida, você nem precisa adicionar o refreshControl à visualização da tabela. Isso é tratado implicitamente.
Kendrick Ledet
1
@KendrickLedet mesmo se você não usar um UITableViewController?
Van Du Tran
3
Como eu poderia usar esta solução na parte superior da tabela e na parte inferior?
AustinT
3
Swift 4 atualização: refreshControl.addTarget (self, ação: "refresh:", para: .valueChanged)
Akseli
148

Uma solução com storyboard e rapidez ...

1.) Abra o arquivo .storyboard, selecione um TableViewController no storyboard e "Ative" o recurso Table View Controller - Refreshing nos Utilitários.

insira a descrição da imagem aqui

2.) Abra a classe UITableViewController associada e adicione a seguinte linha ao método viewDidLoad.

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

Editado para o Swift 5.0:

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

OU no Swift 2.2:

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

3.) Adicione o seguinte método acima do método viewDidLoad

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

    self.tableView.reloadData()
    self.refreshControl?.endRefreshing()
}
Em branco
fonte
7
Além disso, você pode adicionar a ação de atualização com storyboard por controle-arrastando a partir de Controle Atualizar no storyboard para o seu ViewController
uiureo
Se meus dados de carregamento forem assíncronos, devo put self.tableView.reloadData()e self.refreshControl?.endRefreshing()no retorno de chamada?
Qian Chen
Exatamente! E coloque-o reloadData()na fila principal para atualizar sua interface do usuário instantaneamente: dispatch_async(dispatch_get_main_queue(),{ self.tableView.reloadData() });
Blank
1
Desta forma, foi preferido sobre a resposta aceita pela razão de que há, então, há erros de layout (pelo menos para mim usando rápida 2+)
Ryan Walton
1
Essa resposta deve ter a maioria dos votos e ser a resposta correta
krummens
75

Gostaria de mencionar um recurso BONITO FRESCO que foi incluído desde o iOS 10, que é:

Por enquanto, o UIRefreshControl é diretamente suportado em cada um dos UICollectionView, UITableViewe UIScrollView!

Cada uma dessas visualizações possui a propriedade refreshControl da instância, o que significa que não é mais necessário adicioná-la como uma subview na visualização de rolagem , tudo o que você precisa fazer é:

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

Pessoalmente, acho mais natural tratá-lo como uma propriedade da visualização de rolagem do que adicioná-la como uma subvisão, especialmente porque a única visualização apropriada para ser uma superview para um UIRefreshControl é uma visualização de rolagem, ou seja, a funcionalidade de usar UIRefreshControl é apenas útil ao trabalhar com uma exibição de rolagem; É por isso que essa abordagem deve ser mais óbvia para configurar a exibição do controle de atualização.

No entanto, você ainda tem a opção de usar o addSubviewbaseado na versão do iOS:

if #available(iOS 10.0, *) {
  collectionView.refreshControl = refreshControl
} else {
  collectionView.addSubview(refreshControl)
}
Ahmad F
fonte
ei cara, o que eu chamo na função doSomething? se eu chamar reload.Data ele não quer carregar novamente!
@JavierV. adicione um ponto de interrupção na doSomethingfunção, se estiver acessível, você deve verificar seu 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
}

E você pode parar de atualizar com:

refreshControl.endRefreshing()
Gilad Brunfman
fonte
Não se esqueça de mencionar tableView.reloadData()no seu exemplo!
Konstantinos Natsios
Oi eu crio minha refreshcontrol por aquele caminho: 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 }. Em seguida, chame endRefreshing (), não está funcionando (o refreshcontrol ainda aparece lá), mas siga seu caminho, funcionou, por favor, deixe-me saber por que?
Lee17 /
@lee Porque o rfControl é local e não tem acesso de fora. Tente inicializar rfControl como uma variável global para o VC: var rfControl = UIRefreshControl () e parada com rfControl.endRefreshing ()
Gilad Brunfman
Uma pergunta: onde o .valueChangedevento é acionado? Eu não entendo essa conexão.
Júniorgarcia
quando o UIRefreshControl é acionado, como você vê quando você addTarget: refreshControl.addTarget (self, ação: #selector (self.refresh), para: UIControlEvents.valueChanged)
Gilad Brunfman
9

No Swift, use isso,

Se você deseja ter um pull para atualizar no WebView,

Então tente 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
fonte
Obrigado senhor! Resolvi o problema de um noob que eu estava tendo enquanto aprendia.
Adrian David Smith
5

A resposta de Anhil me ajudou muito.

No entanto, depois de experimentar mais, notei que a solução sugerida às vezes causa uma falha na interface do usuário não tão bonita .

Em vez disso, seguindo essa abordagem * fez o truque para mim.

* 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
fonte
2

O que o erro está dizendo é que refreshnão foi inicializado. Observe que você optou por refreshnão ser opcional, o que no Swift significa que ele deve ter um valor antes de ligar super.init(ou é chamado implicitamente, o que parece ser o seu caso). Ou façarefresh opcional (provavelmente o que você deseja) ou inicialize-o de alguma forma.

Eu sugeriria a leitura da documentação introdutória do Swift novamente, que cobre isso amplamente.

Uma última coisa, que não faz parte da resposta, como apontado por @Anil, existe uma atração interna para atualizar o controle no iOS chamado UIRefresControl, que pode ser algo que vale a pena investigar.

JustSid
fonte
2

Criei um aplicativo de feed RSS no qual tenho um recurso Puxar para atualizar que originalmente apresentava alguns dos problemas listados acima.

Mas, para adicionar às respostas dos usuários acima, eu estava procurando em todo lugar o meu caso de uso e não consegui encontrá-lo. Eu estava baixando dados da web (RSSFeed) e queria colocar na minha tabela a exibição de histórias para atualizar.

O que é mencionado acima cobre as áreas certas, mas com alguns dos problemas que as pessoas estão tendo, aqui está o que eu fiz e funciona:

Adotei a abordagem do @Blankarsch e fui para o main.storyboard e selecione a visualização da tabela para usar a atualização. O que não foi mencionado é a criação do IBOutlet e do IBAction para usar a atualização com eficiência.

//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 isso ajude alguém na mesma situação que eu

Dom Bryan
fonte
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()
}
henen
fonte
2

Detalhes

  • Xcode Versão 10.3 (10G8), Swift 5

Recursos

  • Capacidade de fazer "puxar para atualizar" programaticamente
  • Proteção contra vários eventos "pull to refresh"
  • Capacidade de continuar animando o indicador de atividade quando o controlador de exibição é alterado (por exemplo, no caso do TabController)

Solução

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

Amostra Completa

Não se esqueça de adicionar o código da solução aqui

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
fonte
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
fonte
1

Sugiro fazer uma extensão do pull To Refresh para usar em todas as classes.

1) Crie um arquivo rápido e vazio: Arquivo - Novo - Arquivo - Arquivo Swift.

2) Adicione o seguinte

    //  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) No Your View Controller, chame estes métodos como:

  override func viewWillAppear(animated: Bool) {

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

4) Em algum momento, você queria terminar a atualização:

  func pullToRefreshBidderTable() {
self.makePullToRefreshEndRefreshing("bidderListTable")    
//Code What to do here.
}
OR    
self.makePullToRefreshEndRefreshing("bidderListTable")
AG
fonte
1
Seu código está com o nome do projeto e o aviso de direitos autorais, pode não ser bom para você :). Qualquer código que você postou aqui deve ser livre para todos para uso
Anil Varghese
Obrigado Anil! Eu esqueci de removê-los.
AG
1

Para o puxar para atualizar eu estou usando

DGElasticPullToRefresh

https://github.com/gontovnik/DGElasticPullToRefresh

Instalação

pod 'DGElasticPullToRefresh'

import DGElasticPullToRefresh

e coloque essa função no seu arquivo rápido e chame essa função do seu

substituir func 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!)
 }

E não se esqueça de remover a referência enquanto a vista desaparecerá

Para remover o pull para atualizar, coloque esse código no seu

substituir func viewDidDisappear (_ animado: Bool)

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

 }

E vai parecer

insira a descrição da imagem aqui

Feliz codificação :)

Azharhussain Shaikh
fonte
1

Você pode conseguir isso usando poucas linhas de código. Então, por que você ficará preso na biblioteca ou na interface do usuário de terceiros? Puxe para atualizar é construído no iOS. Você poderia fazer isso rapidamente

insira a descrição da imagem aqui

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  
}
Mr.Javed Multani
fonte
0

você pode usar esta subclasse 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 - no construtor de interface altere a classe do seu tableView para PullToRefreshTableViewou crie um PullToRefreshTableViewprogramaticamente

2 - implemente o PullToRefreshTableViewDelegatecontrolador no seu modo de exibição

3 - tableViewDidStartRefreshing(tableView: PullToRefreshTableView)será chamado no seu controlador de exibição quando a exibição da tabela começar a ser atualizada

4 - ligue yourTableView.endRefreshing()para terminar a atualização

Chuy47
fonte
0

Foi assim que eu fiz o trabalho usando o Xcode 7.2, que eu acho que é um erro grave. Eu estou usando dentro do meu UITableViewControllerdentro do meuviewWillAppear

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

configureMessages()

func configureMessages() {
    // configuring messages logic here

    self.refreshControl!.endRefreshing()
}

Como você pode ver, eu literalmente tenho que chamar o configureMessage()método depois de configurar o meu UIRefreshControle depois disso, as atualizações subsequentes funcionarão bem.

jaytrixz
fonte
-1

Outras respostas estão corretas, mas para obter mais detalhes, verifique este post Puxe para atualizar

Ativar atualização no Storyboard

Ao trabalhar com um UITableViewController, a solução é bastante simples: primeiro, selecione o controlador de exibição de tabela em seu storyboard, abra o inspetor de atributos e ative a atualização:

Um UITableViewController é equipado com uma referência a um UIRefreshControl pronto para uso. Você só precisa conectar algumas coisas para iniciar e concluir a atualização quando o usuário puxa para baixo.

Substituir viewDidLoad ()

Na sua substituição de viewDidLoad (), adicione um destino para manipular a atualização da seguinte maneira:

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. Desde que eu especifiquei “handleRefresh:” (observe os dois pontos!) Como o argumento de ação, preciso definir uma função nesta classe UITableViewController com o mesmo nome. Além disso, a função deve receber um argumento
  2. Gostaríamos que essa ação fosse chamada para o UIControlEvent chamado ValueChanged
  3. Não esqueça de ligar refreshControl.endRefreshing()

Para mais informações, acesse o link Link e todo o crédito será referente a esse post

Singhak
fonte
Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
Tunaki