【发布时间】:2018-10-27 17:04:30
【问题描述】:
谁能确认iOS(Swift)中的DateFormatter属于ViewModel或模型或控制器等架构的哪个级别??
【问题讨论】:
标签: ios model-view-controller mvvm nsdateformatter
谁能确认iOS(Swift)中的DateFormatter属于ViewModel或模型或控制器等架构的哪个级别??
【问题讨论】:
标签: ios model-view-controller mvvm nsdateformatter
它应该在视图模型中:
ViewModel encapsulates data/properties that the view can bind to and any validation logic and actions that can be performed。通常,ViewModel 通过调用模型类中的方法与模型交互。 ViewModel 然后以视图可以轻松使用的形式提供来自模型的数据。在这种模式中,我们实质上是在获取应用程序的状态并将其放入 ViewModel。
【讨论】:
基本上,您对模型所做的任何更改或从模型中获取任何数据都应该转到 viewModel。 因此,您应该在 viewModel 中有 dateformatter
【讨论】:
视图模型
它充当模型和视图之间的中介,视图模型提供业务逻辑和视图/视图控制器之间的连接。
视图 (UI) 通过将输入数据(由模型定义)传递给 viewModel 来响应用户输入。反过来,ViewModel 评估输入数据并根据业务逻辑工作流以适当的 UI 表示进行响应。此外,视图模型将触发所有发送和接收数据的调用(使用数据管理器)以及任何数据操作以准备将其显示在视图中。
您可以在下面的链接中找到完整的答案
【讨论】:
尽管此处发布了答案,但我们应该更深入地研究这个特定案例。日期格式化程序是一种在日期(时间戳)和该时间戳作为字符串的可视化表示之间进行转换的工具。在某种意义上,这是关于如何呈现信息的描述。在我看来,它更接近于例如 font,它通常在视图中。
如果您在多种情况下使用视图模型,则意味着您可能需要同一数据的多种不同表示。例如,可以在表格视图单元格上使用相同的模型来单独使用日期。然后按下单元格可能会打开一个新屏幕,代表相同的模型显示日期和时间,甚至日期的年龄。
从这个角度来看(不是我看错了),我宁愿将日期格式化程序放在视图或视图控制器上。对 UILabel 的子类进行成像,将属性暴露给 dateFormat 和 date,用于单独显示日期。
要知道的另一件非常重要的事情是,日期格式化程序在初始化它们时非常慢。因此,如果可能的话,我们会尝试使用将日期格式化程序保存在可以重用的静态上下文中的工具。有些人制作像DataTools.timeString(fromDate: myDate) 之类的工具,其他人在Date 上扩展为myDate.timeString。有些甚至会枚举格式化程序导致myDate.string(formattedAs: .time)。
使用最后一种方法可能是最好的,因为您甚至可以将格式用作属性。现在你基本上需要选择哪个看起来更适合你:
timeLabel.text = model.date.string(formattedAs: .time)
dateLabel.text = model.date.string(formattedAs: .shortDate)
或
timeLabel.text = model.dateStringFormattedAsTime
dateLabel.text = model.dateStringFormattedAsShortDate
所以如果你问我DateFormatter 应该在一些静态上下文中,而格式描述也应该尽可能接近视图本身。
【讨论】:
attributedText(或任何属性),它允许将字体信息与字符串本身捆绑在一起。这允许视图模型对象准确指定您声称属于视图一部分的渲染属性。
UIKit 的开发人员可能会对如何指定标签的字体做出不同的决定。我们不能知道任何一种方式,所以比较它们是无效的。我碰巧认为选择是一样的,因为字体是标签用途的必要组成部分。
你可以有这样的东西:
enum FormatDateTimeType {
case time
case shortDate
}
extension Date {
func string(_ formattedAs: FormatDateTimeType) {
.......
}
}
那么你的文本组件应该像这样使用日期“字符串”函数:
myTextField.text = myModel.date.string(.shortDate)
【讨论】: