首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

架构之路 (五) —— VIPER架构模式(一)

开始 首先看下主要内容: 本教程,您将了解如何SwiftUI和Combine中使用VIPER体系结构模式,同时构建一个允许用户创建公路旅行的iOS应用程序,来自翻译。...VIPER为这种情况提供了一种替代方案,可以与SwiftUI和Combine结合使用,帮助构建具有清晰架构的应用程序,该架构有效地分离了所需的不同功能和职责,如用户界面、业务逻辑、数据存储和网络。...MVVM是一种流行的体系结构,View Model它将视图逻辑与业务逻辑分离开来。视图模型与模型Model交互。...命令式UI范例——换句话说,UIKit——路由router将负责显示视图控制器或激活segue。 SwiftUI将所有目标视图声明为当前视图的一部分,根据视图状态显示它们。...当您将其放置NavigationView时,该链接将成为一个按钮,将destination推送到导航堆栈上。 content块可以是任何一个SwiftUI视图。

17.4K10

肘子的 Swift 周报 #033|改善社区活跃度,仅更新论坛还不够

本文中,我将主要讨论那些对我个人影响深远的变化,探讨与 SwiftUI 以及苹果生态系统密切相关的其他框架和功能的演变,展示它们如何共同塑造了我们今天所使用的平台。...此外,作者还分享了使用 Result Builders 过程的经验教训和个人建议,尤其是关于如何简化具体化复杂概念以解决问题的策略。...Antoine van der Lee[13] 由于 SwiftUI 的声明式编程范式和数据流管理方式与传统的 MVVM 实现有所不同,使得许多开发者对于 MVVM 是否适用于 SwiftUI 感到疑惑...在这篇文章,Antoine van der Lee 探讨了如何以适合 SwiftUI 的方式实施 MVVM 架构模式来构建视图。...文章详细分析了从 UIKit 转向 SwiftUI 时常见的误区,通过具体的代码重构示例展示了如何提升 SwiftUI 代码的可读性和维护性。

10910
您找到你想要的搜索结果了吗?
是的
没有找到

如何结合 Core Data 和 SwiftUI

设置核心数据需要两个步骤:创建所谓的持久性容器(从容器存储中加载保存实际数据),然后将其注入 SwiftUI 环境,以便我们所有的视图都可以访问它。 Xcode 模板已经为我们完成了这两个步骤。...因此,剩下的就是我们要决定要在 Core Data 存储哪些数据,以及如何读出这些数据。...SwiftUI 有一个解决方案,而且——您猜对了——这是另一个属性包装器。这次将其称为@FetchRequest,它带有两个参数:我们要查询的实体以及我们希望结果如何排序。...更好的是,它已经将其添加到 SwiftUI 环境,这就是@FetchRequest属性包装器起作用的原因——它使用了环境可用的任何托管对象上下文。...这需要附加到托管对象上下文中,以便对象知道应将其存储何处。然后,我们可以像通常为结构体那样分配值。

11.8K30

Ask Apple 2022 与 SwiftUI 有关的问答(上)

Ask Apple 为开发者与苹果工程师创造了 WWDC 之外进行直接交流的机会。本文对本次活动SwiftUI 有关的一些问答进行了整理,添加了一点个人见解。本文为上篇。...MVVMQ: UIKit 时代,MVVM 是一种常见的架构,视图显示的数据来自一个单独的 viewModel 类。...使用一个共同的底层数据源,并将其投射到 UI 的需求上,这样就可以对该模型进行单元测试,以确保常规和紧凑的投影是一致的。...如果发生这种情况,克服这种情况的技术是在外部存储上保存一些数据,只在内存中保留最相关的数据和一个标识符,以便能够完全取回其余的数据。...下划线会让它看起来有点诡异,但访问底层存储并没有错。官方文档主要试图指出人们最常见的用法,这样他们就不会一开始就试图直接初始化他们的属性包装器。

12.2K20

使用 SwiftUI 创建一个灵活的选择器

使用 UIKit 时,我总是将这种类型的视图实现为具有特定 UICollectionViewFlowLayout 的 UICollectionView。但在 SwiftUI 如何实现呢?...首先,我需要一个函数来计算返回输入数据的所有宽度。我通过将所有输入值映射到元组,其中包含输入值和自身的宽度来完成。...我们有两个数组: singleLineResult 数组——负责存储适合特定行的项目 allLinesResult 数组——负责存储所有项目数组(每个数组都等同于一行项目) 首先,我们检查从 HStack...VStack 的高度是根据两个值计算的: 输入数据任何项目的高度(类似于宽度的计算,通过使用 reduce 函数,总结与项目相关的所有高度) 将显示 VStack 的行数 private func...然后,详细介绍了实现该选择器的逻辑,包括如何处理选项的布局、宽度和高度,以及如何处理用户与按钮的交互。 最后,提供了一个简单的视图实现,可以 SwiftUI 中使用该选择器。

24720

SwiftU:循环中创建视图

通常在一个循环中创建多个SwiftUI视图。例如,我们可能想要遍历一系列名称,让每个名称成为文本视图,或者遍历一系列菜单项,并将每个名称显示为图像。...SwiftUI为此提供了一个专用的视图类型,称为ForEach。这可以在数组和范围上循环,根据需要创建尽可能多的视图。更妙的是,ForEach不会像我们手动输入视图一样被10个视图限制所影响。...ForEach将为其循环的每个项运行一次闭包,传入当前循环项。例如,如果我们从0循环到100,它将传入0、1、2,依此类推。...4、使用ForEach循环遍历所有可能的学生姓名,将其转换为文本视图。...5、ForEach,我们从0数到(但不包括)数组的学生数。 6、我们为每个学生创建一个文本视图,显示该学生的姓名。

2.2K20

AVKit框架详细解析(四) —— 基于AVKit 和 AVFoundation框架的视频流App的构建

在此过程,您将学习 AVKit 和 AVFoundation 框架的基础知识。 本教程,您将学习如何: 添加本地视频。 添加流媒体视频。 启用播放控件。 实现循环。 实现画中画。...您将看到的第一个是当前位于手机存储的类型。 稍后,您将学习如何从服务器播放视频流。...这就是应用程序如何数据填充现有列表的方式。 视频本身来自嵌入应用程序包的 JSON 文件。 如果您好奇,您可以查看 Video.swift 以了解它们是如何获取的。...2) 您使用初始值设定项创建 LoopingPlayerUIView 的新实例返回新实例。 3) SwiftUI 需要更新底层 UIView 时会调用此方法。 现在,将其留空。...2) 双击时 1x 和 2x 速度之间切换。 您将从完成这些事情所需的实际方法开始。 首先,您需要在 LoopingPlayerUIView 公开一些可以直接访问播放器的方法。

6.9K10

肘子的 Swift 周报 #001

然而,过了一段时间,我发现当我从记忆寻找技术线索时,那些我仔细筛选、阅读推荐的文章给我留下了深刻的印象。停刊后,虽然我每天也阅读不少文章和博客,但印象没有之前担任编辑时那么深刻。...原创 揭秘 SwiftData 的数据建模原理[1] fatbobman[2] SwiftData 的数项改进,用纯代码声明数据模型无疑给 Core Data 开发者留下了深刻印象。...Data 和 SwiftData 以指向同一个持久化数据存储,本文将记录他的操作和使用心得。...解密 SwiftUI 背后的 AttributeGraph[12] KyleSwifter[13] 在工作,作者发现在 watchOS 10 上的某段代码会出现 AttributeGraph 的循环依赖错误提示...作为 A Companion for SwiftUI[17] 的作者,Javier SwiftUI 发布初期就表现出对 SwiftUI 的动画和布局实现的浓厚兴趣,通过博客展示了令人惊叹的研究成果

24740

SwiftUI属性包装器如何处理结构体

已经了解了 SwiftUI 如何通过使用 @State 属性包装器将变化的数据存储结构体如何使用 $ 将状态绑定到UI控件的值,以及更改 @state 包装的属性时是如何自动让 SwiftUI 重新调用我们的结构体的...也许我们想将其保存到 UserDefaults ,运行一个方法,或者只是打印出该值以进行调试。...为了了解这里发生的事情,我希望您考虑一下我们使用 Core Data 时:我们使用 @FetchRequest 属性包装器查询我们的数据,但我还向您展示了如何直接使用 FetchRequest 结构体...现在将其激活,然后输入 "State"——希望第一个结果在其下方显示 SwiftUI,但如果没有,请找到选择它。...在后台,它将值发送给SwiftUI以便存储可以自由修改的位置,因此,结构体本身永不改变。

1.7K10

Ask Apple 2022 与 SwiftUI 有关的问答(下)

A:用数组索引来存储选择是很脆弱的:如果数组发生了突变,选择就会变得不同步。Swift Collections[6] 有一个 OrderedDictionary,可能会对你有所帮助。... SwiftUI 布局 —— 尺寸( 上 )[8] 一文,对建议尺寸的几种模式都进行了介绍。如何减少主线程的负担Q:如何避免所有操作都被放置主线上?...Swiftcord[12] 的代码展示了如何SwiftUI 下实现倒置列表。阅读 优化 SwiftUI List 显示大数据集的响应效率[13] 一文,了解苹果工程师推荐的方法。...两种方案,如果在数据量很大的情况下,我更倾向于第一种方式,这样可以按需求读取数据。...macOS APIQ:对于运行 Monterey 的 Mac,能否如何SwiftUI 实现下面需求的建议:打开一个窗口该窗口中初始化数据找到所有打开的窗口确定一个窗口是否打开从不在该窗口的视图中关闭一个窗口

14.7K30

SwiftUI 实现音频图表

下面我们将学习如何通过使用 accessibilityChartDescriptor 视图修饰符为任何 SwiftUI 视图构建音频表示,呈现类似自定义条形图视图或图像的图表。...DataPoint 结构体 让我们从 SwiftUI 构建一个简单的条形图视图开始,该视图使用垂直条形显示一组数据点。...ContentView 结构体 我们能够 SwiftUI 轻松构建条形图视图。接下来让我们尝试使用带有示例数据的新 BarChartView。...我们还为图表创建了一个可访问元素,禁用了其子元素的可访问性信息。为了改进图表视图的可访问性体验,我们还添加了可访问性标签。 最后,我们可以开始为我们的条形图视图实现音频图表功能。...这些音调代表数组数据。 实现协议 现在,我们可以讨论 BarChartView 实现此功能的方法。

15010

SwiftUI 与 Core Data —— 数据获取

本文中我们将探讨 SwiftUI 视图中批量获取 Core Data 数据的方式,尝试创建一个可以使用 mock 数据的 FetchRequest。...DynamicProperty 协议为数据提供了访问 SwiftUI 托管数据池的能力。通过未公开的 _makeProperty 方法,数据可以 SwiftUI 数据池中申请空间进行保存读取。...创建自定义 DynamicProperty 类型时,需要注意以下几点:可以自定义类型中使用环境值或环境对象视图被加载后,视图中所有符合 DynamicProperty 协议的类型也将一具备访问环境数据的能力...( sectionIdentifier 为首要排序条件 ),并同时提供每个 Section 返回数组对应的起始 offset( 或对应的 ID )以及该 Section 数据量。...在下一篇文章,我们将探讨如何SwiftUI 安全地响应数据如何避免因为数据意外丢失而导致的行为异常以及应用崩溃。希望本文能够对你有所帮助。

4.6K30

iOS13 Scene Delegate

Application Session Role: 是一个数组,用于应用程序声明场景。...然后,AppDelegate类的新函数。 它管理scene sessions(场景会话),提供场景的配置数据响应用户丢弃场景的事件。...storyboard项删除 注意2:AppDelegate的有关事件循环的方法,iOS 13后是不会走的,iOS13以下的才会收到事件回调的。...接着为SwiftUI项目创建了ContentView实例,通过使用UIHostingController将其添加为根视图控制器。 该控制器用于将基于SwiftUI的视图显示屏幕上。...scene(_: willConnectTo: options: )函数内,创建一个SwiftUI视图,将其放置托管控制器,然后将控制器分配给window属性的根视图控制器,并将该窗口放置应用程序

5.1K20

Swift 5.4 新特性

它们为 SwiftUI 的视图创建系统的大部分提供了支持,因此,当我们拥有一个内部包含各种视图的 VStack 时,Swift 会将它们静默地分组为内部 TupleView 类型,以便可以将其存储为 VStack...就像 SwiftUI 一样,我们可能想单独提供它们,让 Swift 得出结果: // This is invalid Swift, and will not compile. // func makeSentence2...每个结果生成器必须提供至少一个称为 buildBlock() 的静态方法,该方法应获取某种数据将其转换。上面的示例接收零个或多个字符串,将它们连接起来,然后将它们作为单个字符串发送回去。...例如,我们可以通过添加两个额外的方法来描述我们想如何转换数据,从而为 SimpleStringBuilder 添加 if/else 支持。...现在支持局部变量的属性包装器 属性包装器最初是 Swift 5.1 引入的,它是一种通过简单,可重复使用的方式将附加功能附加到属性的方法,但是 Swift 5.4 ,它们的行为得到扩展以支持将其用作函数的局部变量

1.6K40

ViewBuilder 研究(上)—— 掌握 Result builders

访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验 本文希望达成的目标 希望阅读完两篇文章后能消除或减轻你对下列疑问的困惑: 如何让自定义视图、方法支持 ViewBuilder...实现 buildBlock 方法时,components 与 block 的返回数据类型应根据实际需求定义,无需一致。...支持 for...in 循环 for...in 语句将所有迭代的结果一收集到一个数组传递给 buildArray。提供 buildArray 的实现即可让构建器支持循环语句。...这种情况 SwiftUI 很常见,例如某些 View 或 modifier 仅支持较新的平台,我们需要为不支持的平台提供其他的内容。... SwiftUI ,内层的设定应优先于外层的设定。为了解决这个问题,我们需要对 AttributedString 的 modifier 做一些修改。

3K20

优化 SwiftUI List 显示大数据集的响应效率

SwiftUI 视图的生命周期研究[3] 一文,我对 List 如何对子视图的显示进行优化做了一定的介绍。...标识( Identity )是 SwiftUI 程序的多次更新识别相同或不同元素的手段,是 SwiftUI 理解你 app 的关键。...由于整个的滚动过程仅实例化绘制了 100 多个子视图,对系统的压力并不大,因此经过反复测试后,首次点击 bottom 按钮会延迟滚动的问题大概率为当前 ScrollViewProxy 的 Bug...如果在正式开发面对需要在 List 中使用大量数据的情况,我们或许可以考虑下述的几种解决思路( 以数据采用 Core Data 存储为例 ): 数据分页 将数据分割成若干页面是处理大数据集的常用方法,...获取若干最新数据,将数据逆向添加入数组 列表显示后率先移动到最底端(取消动画) 通过 refreshable 调用下一批数据继续逆向添加入数组 用类似的思路,还可以实现向下增量读取或者两端增量读取

9.1K20
领券