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 中动态创建控件的主要内容,如果未能解决你的问题,请参考以下文章

为扫雷游戏动态创建游戏板

WPF MvvM DataGrid 动态列

如何为 iOS 应用动态设计或创建带有动态 ui 控件的视图

iOS:动态创建并分配名称给 UIControl

如何在WPF中动态创建布局(MVVM模式)

如何动态创建控件并在swift 4中动态对齐?