【问题标题】:DateFormatter in iOS belongs to view model or model or controller?iOS中的DateFormatter属于视图模型还是模型或控制器?
【发布时间】:2018-10-27 17:04:30
【问题描述】:

谁能确认iOS(Swift)中的DateFormatter属于ViewModel或模型或控制器等架构的哪个级别??

【问题讨论】:

    标签: ios model-view-controller mvvm nsdateformatter


    【解决方案1】:

    它应该在视图模型中:

    ViewModel encapsulates data/properties that the view can bind to and any validation logic and actions that can be performed。通常,ViewModel 通过调用模型类中的方法与模型交互。 ViewModel 然后以视图可以轻松使用的形式提供来自模型的数据。在这种模式中,我们实质上是在获取应用程序的状态并将其放入 ViewModel。

    【讨论】:

      【解决方案2】:

      基本上,您对模型所做的任何更改或从模型中获取任何数据都应该转到 viewModel。 因此,您应该在 viewModel 中有 dateformatter

      【讨论】:

      • 你能补充一些详细信息吗
      【解决方案3】:

      视图模型

      它充当模型和视图之间的中介,视图模型提供业务逻辑和视图/视图控制器之间的连接。

      视图 (UI) 通过将输入数据(由模型定义)传递给 viewModel 来响应用户输入。反过来,ViewModel 评估输入数据并根据业务逻辑工作流以适当的 UI 表示进行响应。此外,视图模型将触发所有发送和接收数据的调用(使用数据管理器)以及任何数据操作以准备将其显示在视图中。

      您可以在下面的链接中找到完整的答案

      MVVM vs MVC

      【讨论】:

        【解决方案4】:

        尽管此处发布了答案,但我们应该更深入地研究这个特定案例。日期格式化程序是一种在日期(时间戳)和该时间戳作为字符串的可视化表示之间进行转换的工具。在某种意义上,这是关于如何呈现信息的描述。在我看来,它更接近于例如 font,它通常在视图中。

        如果您在多种情况下使用视图模型,则意味着您可能需要同一数据的多种不同表示。例如,可以在表格视图单元格上使用相同的模型来单独使用日期。然后按下单元格可能会打开一个新屏幕,代表相同的模型显示日期和时间,甚至日期的年龄。

        从这个角度来看(不是我看错了),我宁愿将日期格式化程序放在视图或视图控制器上。对 UILabel 的子类进行成像,将属性暴露给 dateFormatdate,用于单独显示日期。

        要知道的另一件非常重要的事情是,日期格式化程序在初始化它们时非常慢。因此,如果可能的话,我们会尝试使用将日期格式化程序保存在可以重用的静态上下文中的工具。有些人制作像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 应该在一些静态上下文中,而格式描述也应该尽可能接近视图本身。

        【讨论】:

        • 我不认为与字体属性进行比较有两个原因。 1)它是在 MVVM 出现之前就存在于视图上的属性,以及 2)它对于视图本身的渲染是必要的,这绝对是视图的责任。另一方面,日期格式化程序用于生成要显示的字符串,根本不参与呈现该字符串。
        • 除了我之前的评论,见证了不是最近添加的attributedText(或任何属性),它允许将字体信息与字符串本身捆绑在一起。这允许视图模型对象准确指定您声称属于视图一部分的渲染属性。
        • @Avi 它们可能不完全相同,但您的论点完全无效; 1 创建的时间无关紧要。即使后来引入了字体,它仍然是标签的属性。 2. DateFormat 是绘制(转换为字符串)日期所必需的,因此在使用例如描述的子类来显示日期的情况下,它与字体一样重要。
        • @Avi 属性文本仅用于构建更复杂的字符串,这些字符串可能在不同的字符串范围内具有不同的字体、颜色。它们绝不会连接到 MVVM 或任何其他现代程序。如果可能的话,应该不惜一切代价避免它们,因为它们会消耗性能。千万不要为了在模型中构造它而使用属性字符串。
        • 这很重要,因为如果 MVVM 是首选架构,UIKit 的开发人员可能会对如何指定标签的字体做出不同的决定。我们不能知道任何一种方式,所以比较它们是无效的。我碰巧认为选择是一样的,因为字体是标签用途的必要组成部分。
        【解决方案5】:

        你可以有这样的东西:

        enum FormatDateTimeType {
         case time
         case shortDate
        }
        
        extension Date {
         func string(_ formattedAs: FormatDateTimeType) {
             .......
         }
        }
        

        那么你的文本组件应该像这样使用日期“字符串”函数:

        myTextField.text = myModel.date.string(.shortDate)
        

        【讨论】:

          猜你喜欢
          • 2016-01-25
          • 1970-01-01
          • 2012-09-03
          • 2014-08-04
          • 1970-01-01
          • 1970-01-01
          • 2012-10-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多