iOS - 在 MVVM 中动态创建控件
Posted
技术标签:
【中文标题】iOS - 在 MVVM 中动态创建控件【英文标题】:iOS - Dynamically Create Controls in MVVM 【发布时间】:2017-01-28 07:21:27 【问题描述】:我需要根据从服务器检索到的配置在运行时动态创建控件。我也在尝试使用 MVVM 模式。
为了简单起见,假设我必须在 View
中创建 N
数量的 UILabels
,每个都有自己的设置(颜色、字体等),所有这些都基于服务器的配置。
首先想到的是在我的ViewModel
中有一个listUILabels
属性,并让ViewModel
负责创建UILabel
对象并设置它们的属性/属性(颜色、字体、等)。
然后View
将遍历viewModel.listUILabels
中的每个UILabel
,通过self.view.addSubview()
添加每个@
但是我在一些示例中读到,ViewModel
不应引用 UIKit
,而应仅提供 View
的数据、属性和枚举(请随时对此发表评论)。
为了遵守 MVVM 规则,我应该如何划分我的逻辑,在这种情况下,视图内部是什么以及 ViewModel
内部是什么?
【问题讨论】:
【参考方案1】:在我看来,您的 View 类应该包含用于创建 UILables 并根据配置设置设置其 UI 行为的逻辑。
ViewModel 应该提供与底层数据交互的接口(属性),当数据源(模型)中的数据发生变化时应该更新视图,并且当数据基于用户交互发生变化时,数据源(模型)应该更新(如果有的话)。
【讨论】:
【参考方案2】:基本上ViewModel
应该尽可能独立于View
。它应该是相关且逻辑上属于单个页面的数据的表示,但它不应该依赖于视图本身的实现或表示方式。理想情况下,应该可以更改视图及其布局,而无需修改 ViewModel
。
因此,您最好的做法是不在ViewModel
中包含UILabels
的列表,而是放置一个自定义类的列表,它将存储您想要在视图上显示的“数据”。因为在这种情况下,您正在处理与 UI 相关的数据,所以将颜色或字体属性作为这些自定义类的属性应该没有问题。
然后在视图本身中,您可以观察此列表并根据提供的数据动态创建适当的控件 (UILabels
)。
【讨论】:
以上是关于iOS - 在 MVVM 中动态创建控件的主要内容,如果未能解决你的问题,请参考以下文章