【问题标题】:MVC design Pattern - Designing a ModelMVC 设计模式 - 设计模型
【发布时间】:2017-03-06 13:21:42
【问题描述】:

我一直在使用 mvc 设计模式来开发 iOS,我想知道我这样做是否正确。我已经阅读了很多关于 MVC 的内容,并且在我的概念中,所有将显示或将更改视图特性的信息都将存储在模型中(因为它是我的 vc 的“知识”)。因此,在我设计 MVC 的方式中,我通常为用户交互的每个视图创建一个 mvc,并且我有一个模型对象来管理整个应用程序中的所有“共享”信息,以及一个单例来保存一些数据,即“UserSession”类。例如:

在我的 HomeViewController 中,我有不同的子视图,具体取决于我的对象的状态,所以在这个 MVC(家庭)中,我有一个“演示者”作为控制我的 homeSubview 类型及其数据的模型。当我需要从另一个模型对象(如用户或任何对象)中检索信息时,我的“演示者模型”会做到这一点(在这种情况下),并且在项目内的另一个 mvc 中也会发生同样的情况。我的方式是这样的:

控制器 [询问] 模型(如果需要,与其他模型通信)哪个 ['响应'] 控制器然后 [更新] 视图

所以,这对我来说看起来不错,但我觉得我没有正确使用 mvc 模式。谁能给点意见?

提前:对英语感到抱歉。感谢您的任何建议/帮助,谢谢!

【问题讨论】:

    标签: ios design-patterns model-view-controller model


    【解决方案1】:

    我认为您的建议没有任何问题,尽管它听起来更像是 MVVM(C) 模式而不是 MVC。

    所以在 iOS 中,我们几乎不得不使用视图控制器,所以我们需要额外的 (C),但本质上是:

    • M(模型),这些应该代表您的数据模型。 class Model { var firstName: String var lastName: String .... }
    • V(视图),这应该处理演示、绘制到屏幕和显示数据 class View: UIView { let fullNameLabel = UILabel() }
    • VM(视图模型),您可以在此处调整模型中的数据以适应您的视图需要。这很好,因为如果您有多个视图来显示来自同一个模型类的数据,您只需要添加一个新的视图模型,以适应它想要的数据,而不是用大量的辅助方法弄乱您的模型 class ViewModel { let model: Model func fullName() -> String { return "(model.firstName) (model.lastName)" } }

    显然我们也有一个控制器来协调整个事情:)

    在我看来,这更像是你正在做的事情,你的 presenter 是视图模型。

    这有助于封装实际上不属于您的视图或模型的功能。全名在技术上不是数据模型的一部分,也不是渲染/展示的一部分,因此我们将其移至适配器/展示器/视图模型(无论您想怎么称呼它)。

    也许这对你有帮助?如果您需要更多反馈/有任何问题,请随意包含任何其他信息的代码示例?‍?

    【讨论】: