ども、インディです。
今日はあの「引っ張って更新」機能を実装する際に必要になるUIRefreshControlについてです。
昨日、会社のコードをみていたらあらゆるViewControllerに「引っ張って更新」機能のコードがコピペされていました。。
これなんとかならないかなあ、と思い調べてみたら素敵な記事を発見。

UIRefreshControlを追加するのにサブクラスは要らない - Qiita
とりあえずこれを見てほしい。
突然ですが、こういう実装をよく見ませんか?
RefreshScrollView.swift
import UIKit
protocol RefreshScrollViewDelegate: c...
こちらを参考にしながら実装したところ割と綺麗に実装できました。
UIScrollViewDelegateを継承したデリゲートメソッドを作成
まず、新たにRefleshControllExtension.swift
を作成して、UIScrollViewDelegateを継承したUIScrollViewRefreshControlDelegateつくっていきます。
import Foundation
// MARK: - Refresh Control
protocol UIScrollViewRefreshControlDelegate: UIScrollViewDelegate {
func didBeginRefresh(in scrollView: UIScrollView)
}
extension UIScrollView {
func setupRefreshControl() {
self.refreshControl = UIRefreshControl()
self.refreshControl?.attributedTitle = NSAttributedString(string: "読み込み中")
self.refreshControl?.addTarget(self, action: #selector(self.didPullDownScrollView), for: .valueChanged)
}
@objc
private func didPullDownScrollView() {
if let delegate = self.delegate as? UIScrollViewRefreshControlDelegate {
delegate.didBeginRefresh(in: self)
}
}
}
UIScrollViewRefreshControlDelegateはUIScrollViewDelegateを継承しているので、他のクラスでUIScrollViewRefreshControlDelegateを使用するだけで引っ張ったときの通知を受け取れます。
それぞれのViewControllerでUIRefreshControlを実装
各クラスではこのように実装します。
class ItemStockViewController: BaseViewController {
@IBOutlet private weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
// UIRefreshControlを追加
tableView.setupRefreshControl()
}
private func updateData () {
// 引っ張ったときの処理を行う
// 処理が終わったら必ず以下を呼び出す
self.tableView.refreshControl?.endRefreshing()
}
}
extension ItemStockViewController: UIScrollViewDelegate {}
extension ItemStockViewController: UIScrollViewRefreshControlDelegate {
func didBeginRefresh(in scrollView: UIScrollView) {
updateData()
}
}

コメント