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 设计模式的主要内容,如果未能解决你的问题,请参考以下文章