【问题标题】:When using MVVM, how do I extend the ViewModel in child ViewControllers?使用 MVVM 时,如何在子 ViewControllers 中扩展 ViewModel?
【发布时间】:2017-08-07 03:27:57
【问题描述】:

我有这样的层次结构:

class OneViewModel {
}

class OneViewController {
  var viewModel = OneViewModel()
}

class TwoViewModel : OneViewModel {
}

class TwoViewController : OneViewController {
  var viewModel = TwoViewModel() // ???
}

我知道 Swift 中不允许覆盖属性类型,但是子 ViewController 携带两个 ViewModel 没有意义,如何解决这个问题?谢谢!

【问题讨论】:

    标签: ios swift mvvm


    【解决方案1】:

    我用这个:

    class OneViewController {
      var viewModel: OneViewModel {
        return storedViewModel
      }
      lazy var storedViewModel: OneViewModel = {
        type(of: self).viewModelProvider()
      }()
      class func viewModelProvider() -> OneViewModel {
        return OneViewModel()
      }
    }
    
    class TwoViewController {
      override var viewModel: TwoViewModel {
        return storedViewModel as! TwoViewModel
      }
      override class func viewModelProvider() -> OneViewModel {
        return TwoViewModel()
      }
    }
    

    设置起来有点冗长,但之后使用起来很简单明了。

    【讨论】:

    • 不错!这正是我想要的,谢谢。像魅力一样工作。
    【解决方案2】:

    这应该可以工作

    class OneViewModel {
    }
    
    class OneViewController {
        var viewModel = OneViewModel()
    }
    
    class TwoViewModel : OneViewModel {
    }
    
    class TwoViewController : OneViewController {
        override init() {
            super.init()
            self.viewModel = TwoViewModel()
        }
    }
    

    您可以在任何地方将您的 viewModel 实例设置为 TwoViewModel 类。

    【讨论】:

    • 是的,我想是的。我对这个解决方案的唯一怪癖是,每次在 TwoViewController 中访问它时,它都需要将视图模型从 OneViewModel 转换为 TwoViewModel。我希望能以某种方式避免这种情况。
    猜你喜欢
    • 2012-07-31
    • 1970-01-01
    • 2015-08-21
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    相关资源
    最近更新 更多