How to use pull to refresh in Swift? How to use pull to refresh in Swift? ios ios

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:

  1. Open your .storyboard file, select a TableViewController in your storyboard and "Enable" the Table View Controller: Refreshing feature in the Utilities.

    Inspector

  2. Open the associated UITableViewController class and add the following Swift 5 line into the viewDidLoad method.

    self.refreshControl?.addTarget(self, action: #selector(refresh), for: UIControl.Event.valueChanged)
  3. 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)}