¿Cómo utilizar tirar para actualizar en Swift?
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.
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()
Una solución con storyboard y Swift:
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.
Abra la
UITableViewController
clase asociada y agregue la siguiente línea Swift 5 alviewDidLoad
método.self.refreshControl?.addTarget(self, action: #selector(refresh), for: UIControl.Event.valueChanged)
Agregue el siguiente método encima del método viewDidLoad
func refresh(sender:AnyObject) { // Updating your data here... self.tableView.reloadData() self.refreshControl?.endRefreshing() }
¡ UIRefreshControl es compatible directamente con cada uno de UICollectionView
y (requiere iOS 10+)!UITableView
UIScrollView
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 addSubview
según la versión de iOS:
if #available(iOS 10.0, *) {
collectionView.refreshControl = refreshControl
} else {
collectionView.addSubview(refreshControl)
}
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()
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
}