Help us understand the problem. What is going on with this article?

【Swift】UIRefreshControl

UIRefreshControlとは

ezgif.com-video-to-gif.gif
UIRefresh Controlとは上記の動画のようなテーブルビューを引っ張って、Viewを更新するためのUIコンポーネントを実装するためのクラスです。

以下が公式ドキュメントになっています。
https://developer.apple.com/documentation/uikit/uirefreshcontrol

iOS9以前の実装方法

class View Controller: UITableViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
    refreshControl = UIRefreshControl()
    refreshControl?.addTarget(self, action: #selector(ViewController.refresh(_:)), forControlEvent: .ValueChanged)
  }

  func refresh(sender: UIRefreshControl) {
    //ここに通信処理などデータフェッチの処理を書く
    //データフェッチが終わったらUIRefreshControl.endRefreshing()を呼ぶ必要がある。
  }
}

iOS9以前はレフレッシュを使用するためにUIRefreshControlを生成し、それをUITableViewControllerのrefreshControlプロパティにセットする形で使用することで実装していました。
しかしこの時点でUIRefreshControlはUITableViewControllerを使わずにUIViewControllerで管理することが難しく動作が保証されていませんでした。
それについての公式リファレンスに記させれいるので抜粋文を下記に記載しておきます。

「Because the refresh control is specifically designed for use in a table view that's managed by a table view controller, using it in a different context can result in undefined behavior.」

iOS 10以降の実装方法

iOS10ではiOS9までの方法も使用することが可能です。
しかしUIScrollViewのプロパティにrefreshControlが追加された事により、UITableViewControllerに依存する事なく使用する事が可能になったのでそれを紹介していきます。

@available(iOS 2.0, *)
open class UIScrollView : UIView, NSCoding {

  //省略

  @available(iOS 10.0, *)
  open var refreshControl: UIRefreshControl?
}

以上のコードのようにUIScrollViewのプロパティに追加されています。

UIViewController管理下のUITableViewに対しての実装

ストーリボードでの表示
スクリーンショット 2019-09-15 12.29.45.png
ストーリボードの表示を見るとViewController配下にTableViewが配置されています。ここではこのような状況の時の実装方法になります。

class ViewController: UIViewController {
  @IBOutlet weak var tableView: UITavleView!

  private let refreshControl = UIRefreshControl()

  override func viewDidLoad() {
    super.viewDidLoad()

    tableView.refreshControl = refreshControl
    refreshControl.addTarget(self, action: #selector(ViewController.refresh(sender:)), for: .valueChanged)
  }

  func refresh(sender: UIRefreshControl) {
    //ここに通信処理などのデータフェッチの処理を記述する
    //最後には必ずUIRefreshControl.endRefreshing()で終了する
}

以上のコードが実装コードになります。ViewControllerクラスの下でUIRefreshControlをインスタンス化、そしてそれをtabelViewに対して使用します。最後にrefresh関数を定義し、その内部でデータ処理とrefreshの終了コードを書けばOKです。

UICollectionViewでの使用

こちららも前回と同じViewController配下での実装になります。
処理内容に前回と大差ないので、コードのみ記しておきます。

class ViewController: UIViewController {

    @IBOutlet weak var collectionView: UICollectionView!

    private let refreshControl = UIRefreshControl()

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView.refreshControl = refreshControl
        refreshControl.addTarget(self, action: #selector(ViewController.refresh(sender:)), for: .valueChanged)
    }

    func refresh(sender: UIRefreshControl) {
        // ここに通信処理などでのデータフェッチの処理を書きます
        // データフェッチが終わったらUIRefreshControl.endRefreshing()を呼びます
    }
}

UIScrollViewでの実装

以下も処理内容は同じです

class ViewController: UIViewController {

    @IBOutlet weak var scrollView: UIScrollView!

    private let refreshControl = UIRefreshControl()

    override func viewDidLoad() {
        super.viewDidLoad()

        scrollView.refreshControl = refreshControl
        refreshControl.addTarget(self, action: #selector(ViewController.refresh(sender:)), for: .valueChanged)
    }

    func refresh(sender: UIRefreshControl) {
        // ここに通信処理などデータフェッチの処理を書きます
        // データフェッチが終わったらUIRefreshControl.endRefreshing()を呼びます
    }
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away