【问题标题】:How to Navigate from one screen to another in swift Working in MVVM如何在 MVVM 中快速从一个屏幕导航到另一个屏幕
【发布时间】:2020-03-11 05:35:29
【问题描述】:

我在没有在 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)`

【问题讨论】:

    标签: ios swift mvvm navigation


    【解决方案1】:

    这就是我一段时间以来一直在视图控制器之间导航的方式,并且发现它非常有效。 我的 ViewController 通常每个都有一个 ViewModel 类,负责逻辑和/或数据加载或保存。我在每个视图控制器中实例化这样的视图模型属性:

    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 将拥有自己的视图模型来处理它的数据加载和持久性。如何将数据从视图模型返回到控制器取决于您。如果它是简单的数据,您可以从函数中返回它,否则对于更复杂或异步的函数,您可以使用委托或闭包。 将数据保留在控制器之外可以防止类变得过于臃肿,并减少控制器之间的依赖关系。

    因此,您通常会在视图模型下拥有某种数据层(可能不止一个)。这可能是视图模型调用的 API,或者应用程序可能具有本地数据库。并且视图模型将其与控制器和视图分开。

    在一个稍微不相关的旁注中,我也更喜欢将我的控制器作为 swift 和 .xib 文件,而不是在可能的情况下使用故事板。我发现大故事板往往变得非常缓慢,最终变得乏味进行更改。然后,您还可以像我在示例中所做的那样初始化控制器,并且不需要先创建情节提要对象。但这只是个人喜好。

    【讨论】:

    • 感谢@James 您的回复,我会尝试您的解决方案,现在看起来不错,对于您的部分答案,如果我们使用超过 1 个故事板来防止控制器集群,您会怎么想在一个故事板中,谢谢
    • @SwiftyBoy 为视图控制器的逻辑组创建多个故事板是完全合理的。这确实取决于您的喜好。我刚刚发现随着项目的增长,大型故事板会变得非常乏味。版本控制软件也不能很好地处理与故事板和 xib 的合并,因此可能会让团队头疼。
    【解决方案2】:

    扩展 UIViewController { 类 func loadNib() -> Self { 返回 loadNib(self) } }

    让 travelVC = ItenararyConfirmationViewController.loadNib() navigationController?.pushViewController(travelVC, animated: true)

    【讨论】:

      猜你喜欢
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2020-07-27
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      相关资源
      最近更新 更多