Swift 配置视图中的 VIPER 设计模式

Posted

技术标签:

【中文标题】Swift 配置视图中的 VIPER 设计模式【英文标题】:VIPER design pattern in Swift configuring view 【发布时间】:2018-08-17 21:05:30 【问题描述】:

我最近迁移到 VIPER,在使用这种类型的架构时提出了这样的问题:

例如,我设计了长(2000pt 高度)的 UI,其中包含 50 多个界面元素,如标签、按钮、视图、集合等,我需要为它们添加圆角和阴影。

我应该在哪里配置它的外观?它应该在 View 中,还是在 Presenter 中?

到目前为止,我已经扩展了 UIView 以创建一个投影方法。

现在,我在 View 模块中拥有的是:

 override func viewDidLayoutSubviews() 
    doctorsNearCollection.backgroundColor = UIColor(white: 1, alpha: 0)
    newsMayBeInterestedCollection.backgroundColor = UIColor(white: 1, alpha: 0)
    recentSavedNewsCollection.backgroundColor = UIColor(white: 1, alpha: 0)
    setupCharts()
    
    scheduleMetting.dropShadow()
    scheduleMetting.layer.cornerRadius = 5
    
    monthlyPerformaceBackground.dropShadow()
    monthlyPerformaceBackground.layer.cornerRadius = 5
    
    firstMeeting.dropShadow()
    firstMeeting.layer.cornerRadius = 5
    firstMeetingNumber.layer.cornerRadius = self.firstMeetingNumber.frame.size.width / 2
    
    secondMeeting.dropShadow()
    secondMeeting.layer.cornerRadius = 5
    secondMeetingNumber.layer.cornerRadius = self.secondMeetingNumber.frame.size.width / 2
    
    thirdMeeting.dropShadow()
    thirdMeeting.layer.cornerRadius = 5
    thirdMeetingNumber.layer.cornerRadius = self.thirdMeetingNumber.frame.size.width / 2
    
    seeAllMeetings.dropShadow()
    seeAllMeetings.layer.cornerRadius = 5
    
    searchForDoctors.dropShadow()
    searchForDoctors.layer.cornerRadius = 5
    
    seeAllSavedNews.dropShadow()
    seeAllSavedNews.layer.cornerRadius = 5

这是一个好习惯吗? 我有兴趣在从其他方法中分解出来的视图外观之间建立共性。对我来说似乎或多或少很清楚。 提前致谢。

【问题讨论】:

永远不要对演示者进行任何与视图相关的更改。 永远。演示者只是应该告诉视图数据相关的处理已经完成。我也将在它们各自的延迟初始化中进行所有这些更改。 @RakeshaShastri 是的,说到懒惰,我也在做,谢谢建议 【参考方案1】: 如https://TheSwiftDev.com/the-ultimate-viper-architecture-tutorial 中所述,UI 细节和构造必须隔离在视图区域中,并且永远不会出现在演示者区域中,因为视图区域处理/隔离所有 UI 细节/概念作为内部事务,而演示者区域处理/隔离所有纯应用域详细信息/概念作为内部事务。 本着永不言败的精神,UI 元素的“圆角和阴影”唯一会出现在演示者区域中的情况是,如果应用的 app-domain 本身是所有关于成为 UI 生成器或 UI 编辑器或 UI 设计器工具的所有内容,其中一些下游(应用程序的)UI(即,不是 应用程序的 UI)是此应用程序的应用程序域。因此,除非您的应用是用于 UI 开发的 UI 设计环境,否则 UI 内容永远不会超出视图区域(即使在例外情况下,它是其他应用的 UI 内容,而不是当前应用的 UI 内容)。 仅仅因为一些以 UI 为中心的代码需要作为视图之间的通用性被分解出来,这并不意味着它获得了 VIPER 处理闯入其他 4 个区域 interactor、presenter、entities、router 作为一种方式表达共性。视区本身可以有图层。一个这样的层是两个或多个视图之间的通用基础设施库。 (另一个这样的层可能是一个外观,它将以 UI 为中心的事件转换为以应用程序域为中心的事件,这些事件在区域间传递给演示者来处理,而不是作为以 UI 为中心的事件,而是作为一个应用程序域事件,与它的方式无关表示在 UI 中。)如果某些函数、方法、过程、子例程或协程需要在视图区域内的多个视图之间作为共性分解出来,则将分解出的函数、方法、过程、子例程或协程保留在库中在可视区域内,而不是任何其他 IPER 区域。

【讨论】:

感谢您的精彩回答和关于 VIPER 教程的链接。我的问题很久以前就有答案了,当时我刚开始学习,对VIPER还知之甚少。

以上是关于Swift 配置视图中的 VIPER 设计模式的主要内容,如果未能解决你的问题,请参考以下文章

viper读取配置文件

viper读取配置文件

Go-viper读取配置文件

使用Viper读取Nacos配置(开源)

在 watch app swift 中应该使用哪种设计模式?

Swift - 分组样式表视图设计