MVVM の画面遷移
最近 MVVM を始めたのですが、画面遷移の方法やそれに伴うパラメータの引渡し方法をどうすべきかというのを考えていて、 kickstarter/ios-oss の方法がわかりやすいと思ったので紹介します。
忙しい人のための3行まとめ
- 遷移元の画面遷移ボタンがタップされたら ViewModel にイベントを伝る
- ViewModel が次の画面に渡すパラメータをセットする
- View が遷移先の ViewController にパラメータを渡し、画面を開く
実際の処理を追う
Signup 画面の Help ボタンから HelpWebView に移動する流れです。
1. 遷移元の画面遷移ボタンがタップされたら ViewModel にイベントを伝る
helpVM?.inputs.helpTypeButtonTapped(helpType)
2. ViewModel が次の画面に渡すパラメータをセットする
self.showWebHelp = helpTypeTapped
.filter { $0 != .contact }
3. View が遷移先の ViewController にパラメータを渡し、画面を開く
self.helpViewModel.outputs.showWebHelp
.observeForControllerAction()
.observeValues { [weak self] helpType in
self?.goToHelpType(helpType)
}
fileprivate func goToHelpType(_ helpType: HelpType) {
let vc = HelpWebViewController.configuredWith(helpType: helpType)
self.navigationController?.pushViewController(vc, animated: true)
}
fileprivate let viewModel: HelpWebViewModelType = HelpWebViewModel()
internal static func configuredWith(helpType: HelpType) -> HelpWebViewController {
let vc = Storyboard.Help.instantiate(HelpWebViewController.self)
vc.viewModel.inputs.configureWith(helpType: helpType)
return vc
}
func configureWith(helpType: HelpType) {
self.helpTypeProperty.value = helpType
}
まとめ
シンプルでわかりやすいですね
MVVM で画面遷移をするとき、View でやるのか ViewModel でやるのか、パラメータはどう渡すべきか迷っていたのですがこのコードを見てだいぶスッキリしました。
enum の使い方も参考になるところがあり、コードを読むと色々勉強になりそうです
KickStarter iOSアプリのStoryboardのenumでの管理のしかたに感動した - Qiita
おまけ
遷移先から遷移前にパラメータを渡したい場合は?
Notification を使うのがいいと思います。
kickstarter のサンプルでは遷移先から遷移前にパラメータを渡す箇所がどこかわからず軽くしか見れていませんが、ソースを Notification
で検索するとかなり出てきますので、おそらくそうやっていると思われます。
(違ったら教えて欲しい )
他の画面遷移方法
Coordinator を使う方法もアーキテクチャとしては良さそうなのですが、まだ初学者なので登場人物がなるべく少ない状態でやりたいと考えていて、慣れてきたらその方法も検討してみたいです