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

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

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

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?()
    }
}

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

var refresher: Refresher!

...

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

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

Pocket
LINEで送る

You may also like...