UIRefreshContrllをちょっとだけ便利に使う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を引数に撮るのもちょっと微妙な気がする。とりあえずメモとして。

カテゴリー: Code

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください