¿Cómo utilizar tirar para actualizar en Swift?

Resuelto xrage asked hace 54 años • 19 respuestas

Estoy creando un lector de RSS usando Swift y necesito implementar la funcionalidad de tirar 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

Ayúdenme a comprender el comportamiento de los reconocedores de gestos. Un código de muestra funcional será de gran ayuda.

Gracias.

xrage avatar Jan 01 '70 08:01 xrage
Aceptado

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

let 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 refrescándote.

refreshControl.endRefreshing()
Anil Varghese avatar Jun 29 '2014 12:06 Anil Varghese

Una solución con storyboard y Swift:

  1. Abra su archivo .storyboard, seleccione un TableViewController en su guión gráfico y "Habilite" el Controlador de vista de tabla: función de actualización en Utilidades.

    Inspector

  2. Abra la UITableViewControllerclase asociada y agregue la siguiente línea Swift 5 al viewDidLoadmétodo.

    self.refreshControl?.addTarget(self, action: #selector(refresh), for: UIControl.Event.valueChanged)
    
  3. Agregue el siguiente método encima del método viewDidLoad

    func refresh(sender:AnyObject)
    {
        // Updating your data here...
    
        self.tableView.reloadData()
        self.refreshControl?.endRefreshing()
    }
    
Blank avatar Dec 18 '2014 13:12 Blank

¡ UIRefreshControl es compatible directamente con cada uno de UICollectionViewy (requiere iOS 10+)!UITableViewUIScrollView

Cada una de estas vistas tiene una propiedad de instancia de refrescoControl , 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
}

@objc 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 en lugar de agregarla 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 tienes la opción de utilizar addSubviewsegún la versión de iOS:

if #available(iOS 10.0, *) {
  collectionView.refreshControl = refreshControl
} else {
  collectionView.addSubview(refreshControl)
}
Ahmad F avatar Apr 20 '2017 16:04 Ahmad F

veloz 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 actualizar con:

refreshControl.endRefreshing()
Gilad Brunfman avatar Jan 06 '2017 15:01 Gilad Brunfman

veloz 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 avatar Jan 13 '2020 12:01 Gurjinder Singh