RxSwift ボタンのタップを検知してViewModelに処理してもらう
記事を書こうと思ったきっかけ
MVVM設計でボタンタップを
registerButton.rx.tap.subscribe(onNext: {
viewModel.createUser()
}).disposed(by: disposeBag)
みたいに書いていたんですけどなんかこれってViewModelの責務なんじゃないのかなと思いモヤモヤするので調べてみました。
実装
ViewModelを以下のようにします。
protocol ViewPresentable {
typealias Input = (
buttonTapped: Driver<()>, ()
)
var input: ViewPresentable.Input { get }
}
class ViewModel: ViewPresentable {
var input: ViewPresentable.Input
private let bag = DisposeBag()
init(input: ViewPresentable.Input) {
self.input = input
self.input.buttonTapped.drive(onNext: {
print("tapped")
}).disposed(by: bag)
}
}
次にViewControllerです。
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
private var viewModel: ViewPresentable!
override func viewDidLoad() {
super.viewDidLoad()
viewModel = ViewModel(input: (
buttonTapped: button.rx.tap.asDriver(), ()
))
}
}
これでボタンをタップしてみると
tapped
できました。
ここで重要なのは
inputの
typealias Input = (
buttonTapped: Driver<()>, ()
)
と
viewModel = ViewModel(input: (
buttonTapped: button.rx.tap.asDriver(), ()
))
ですね。
少し成長できた気分です。
UIの更新だけなら最初のやり方でもいいかもしれないですが、ビジネスロジックなども伴う時はこんな感じで書いた方がいいのかな?と思います。
指摘などありましたらよろしくお願いいたします。
Author And Source
この問題について(RxSwift ボタンのタップを検知してViewModelに処理してもらう), 我々は、より多くの情報をここで見つけました https://qiita.com/apapapa/items/d31907da0a53c5611e04著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .