UIRefreshContrllをちょっとだけ便利に使う

November 14, 2015

UIViewControllerにUITableViewを追加してそこにUIRefreshContrlをつけるというケースの時にちょっと便利になる方法。

UIRefreshControlはvalueChangedで引っ張られたのを検知してテーブルの更新などをするけれど、functionがcontrolをインスタンス化したところと離れたところに書く必要があるので、ちょっと面倒臭い。そこで、下記のようにサブクラス化することで、インスタンス化した直後に処理を書くことができる。

[code lang=swift] final class Refresher: UIRefreshControl { static func setup(#tableView: UITableView) -> Refresher { let refresher = Refresher() tableView.insertSubview(refresher, atIndex: 0) return refresher }

var valueChangedClosure: (() -> Void)?

func setValueChangedAction(closure: () -> Void) { self.valueChangedClosure = closure removeTarget(self, action: “refresh”, forControlEvents: .ValueChanged) addTarget(self, action: “refresh”, forControlEvents: .ValueChanged) }

func refresh() { valueChangedClosure?() } } [/code]

使うときはこういう感じ。

[code lang=swift] var refresher: Refresher!

refresher = Refresher.setup(tableView: tableView) refresher.setValueChangedAction { [weak self] () -> Void in // 値の更新。promiseにしてendRefreshing()もやってしまっている。 self?.viewModel.refresh().andThen { _ -> () in self?.refresher.endRefreshing() } } [/code]

正しいやり方かわからないし、setupでUITableViewを引数に撮るのもちょっと微妙な気がする。とりあえずメモとして。


Profile picture

Written by morizotter who lives and works in Tokyo building useful things. You should follow them on Twitter