How to use pull to refresh in Swift?
Pull to refresh is built in iOS. You could do this in swift like
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 }
At some point you could end refreshing.
refreshControl.endRefreshing()
A solution with storyboard and Swift:
Open your .storyboard file, select a TableViewController in your storyboard and "Enable" the Table View Controller: Refreshing feature in the Utilities.
Open the associated
UITableViewController
class and add the following Swift 5 line into theviewDidLoad
method.self.refreshControl?.addTarget(self, action: #selector(refresh), for: UIControl.Event.valueChanged)
Add the following method above the viewDidLoad method
func refresh(sender:AnyObject){ // Updating your data here... self.tableView.reloadData() self.refreshControl?.endRefreshing()}
I would like to mention a PRETTY COOL feature that has been included since iOS 10, which is:
For now, UIRefreshControl is directly supported in each of UICollectionView
, UITableView
and UIScrollView
!
Each one of these views have refreshControl instance property, which means that there is no longer a need to add it as a subview in your scroll view, all you have to do is:
@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()}
Personally, I find it more natural to treat it as a property for scroll view more than add it as a subview, especially because the only appropriate view to be as a superview for a UIRefreshControl is a scrollview, i.e the functionality of using UIRefreshControl is only useful when working with a scroll view; That's why this approach should be more obvious to setup the refresh control view.
However, you still have the option of using the addSubview
based on the iOS version:
if #available(iOS 10.0, *) { collectionView.refreshControl = refreshControl} else { collectionView.addSubview(refreshControl)}