swift 如何在 MVVM 工作中从一个屏幕导航到另一个屏幕
How to Navigate from one screen to another in swift Working in MVVM
我这样做是在 MVVM 中工作,如下所示,但是在 MVVM 中导航的最佳方法是什么,如果可能的话请考虑这两种情况 - 导航有或没有数据,任何线索将不胜感激:谢谢
let st = UIStoryboard.init(name: "Register", bundle: nil)
let register = st.instantiateViewController(withIdentifier: "RegisterVC" ) as! RegisterVC
register.data = self.data
self.navigationController?.pushViewController(register, animated: true)`
这就是我一段时间以来在视图控制器之间导航的方式,并且发现它非常有效。
我的 ViewController 通常每个都有一个 ViewModel class,负责逻辑 and/or 数据加载或保存。我在每个视图控制器中像这样实例化视图模型属性:
class ExampleViewController: UIViewController {
lazy var viewModel = ExampleViewModel()
override func viewDidLoad() {
super.viewDidLoad()
// Load data to the controller via the view model here
viewModel.loadSomeData()
}
// This could be linked to a button from the UI builder
@IBAction func nextPressed(_ sender: Any) {
// Possibly use the view model to persist data here
viewModel.saveSomeData()
// Then navigate to the next controller
self.navigationController?.pushViewController(NextViewController(), animated: true)
}
}
在上面的示例中,NextViewController 将拥有自己的视图模型来处理它的数据加载和持久性。您如何 return 将数据从视图模型传输到控制器取决于您。如果它的数据很简单,你可以从函数中直接 return ,否则对于更复杂或异步的函数,你可以使用委托或闭包。
将数据保留在控制器之外可以防止 class 变得过于臃肿,并减少控制器之间的依赖性。
所以你通常会在视图模型下有某种数据层(可能不止一个)。这可能是视图模型调用的 API,或者应用程序可能有本地数据库。并且视图模型将其与控制器和视图分开。
在稍微不相关的旁注中,我也更喜欢将我的控制器作为 swift 和 .xib 文件,而不是尽可能使用故事板。我发现大型故事板往往变得非常缓慢,最终变得乏味以进行更改。然后,您还可以像我在示例中所做的那样初始化控制器,并且不需要先创建情节提要对象。但这只是个人喜好。
扩展 UIViewController {
class func loadNib() -> 自我 {
return loadNib(自我)
}
}
让旅行VC = ItenararyConfirmationViewController.loadNib()
navigationController?.pushViewController(travelVC, animated: true)
我这样做是在 MVVM 中工作,如下所示,但是在 MVVM 中导航的最佳方法是什么,如果可能的话请考虑这两种情况 - 导航有或没有数据,任何线索将不胜感激:谢谢
let st = UIStoryboard.init(name: "Register", bundle: nil)
let register = st.instantiateViewController(withIdentifier: "RegisterVC" ) as! RegisterVC
register.data = self.data
self.navigationController?.pushViewController(register, animated: true)`
这就是我一段时间以来在视图控制器之间导航的方式,并且发现它非常有效。 我的 ViewController 通常每个都有一个 ViewModel class,负责逻辑 and/or 数据加载或保存。我在每个视图控制器中像这样实例化视图模型属性:
class ExampleViewController: UIViewController {
lazy var viewModel = ExampleViewModel()
override func viewDidLoad() {
super.viewDidLoad()
// Load data to the controller via the view model here
viewModel.loadSomeData()
}
// This could be linked to a button from the UI builder
@IBAction func nextPressed(_ sender: Any) {
// Possibly use the view model to persist data here
viewModel.saveSomeData()
// Then navigate to the next controller
self.navigationController?.pushViewController(NextViewController(), animated: true)
}
}
在上面的示例中,NextViewController 将拥有自己的视图模型来处理它的数据加载和持久性。您如何 return 将数据从视图模型传输到控制器取决于您。如果它的数据很简单,你可以从函数中直接 return ,否则对于更复杂或异步的函数,你可以使用委托或闭包。 将数据保留在控制器之外可以防止 class 变得过于臃肿,并减少控制器之间的依赖性。
所以你通常会在视图模型下有某种数据层(可能不止一个)。这可能是视图模型调用的 API,或者应用程序可能有本地数据库。并且视图模型将其与控制器和视图分开。
在稍微不相关的旁注中,我也更喜欢将我的控制器作为 swift 和 .xib 文件,而不是尽可能使用故事板。我发现大型故事板往往变得非常缓慢,最终变得乏味以进行更改。然后,您还可以像我在示例中所做的那样初始化控制器,并且不需要先创建情节提要对象。但这只是个人喜好。
扩展 UIViewController { class func loadNib() -> 自我 { return loadNib(自我) } }
让旅行VC = ItenararyConfirmationViewController.loadNib() navigationController?.pushViewController(travelVC, animated: true)