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

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

如果您现在构建并运行,您将不会看到任何有趣的东西。 然而,本教程结束,您将拥有一个功能齐全的道路旅行计划应用程序。 ---- What is VIPER?...当您查看图表,您可以看到数据视图view和实体entities之间流动的完整路径。 SwiftUI有自己独特的做事方式。...最后,TripListView中,ForEach的结束括号后面添加以下内容: .onDelete(perform: presenter.deleteTrip) 将. ondelete添加到SwiftUI...当您将其放置NavigationView中,该链接将成为一个按钮,将destination推送到导航堆栈上。 content块可以是任何一个SwiftUI视图。...最后,将以下内容添加到Text下面的VStack中,从而在TripDetailView中向用户显示: HStack { Spacer() EditButton() Button(action

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

SwiftUIHStack 和 VStack 的切换

当涉及水平和垂直的变体( HStack 和 VStack ),我们需要在这两者之间动态的切换。...使用布局协议 虽然我们最后已经用了非常棒的解决方案,可以在所有支持 SwiftUI 的 iOS 版本中使用,但也让我们来探索一下 iOS 16 中引入的一些新的布局工具(写这篇文章,它作为...Xcode 14 的一部分仍在测试阶段) 其中一个工具是新的 Layout 协议,它既能让我们创建完整的自定义布局,直接集成 SwiftUI 的布局系统中,同时也提供给我们一种更丝滑更动画的方式各种布局之间动态切换...关键的区别在于(除了后者需要 iOS 16 )切换布局可以保留正在渲染的底层视图的标识,而在 HStack 和 VStack 之间切换就不会这样。...同样重要的是要指出,上述基于 ViewThatFits 的技术将会始终尝试 HStack ,即使在用紧凑尺寸渲染布局也是如此,只有 HStack 不适合时才会选择基于VStack 的布局。

2.8K10

SwiftUI 布局协议 - Part 1

简介 今年 SwiftUI 新增最好的功能之一必须是布局协议。它不但让我们参与布局过程中,而且也给了我们一个很好的机会去更好的理解布局 SwiftUI 中的作用。...这将确保我们开始探索第二部分中描述的更多高级特性,我们同一进度。...如果在阅读本文的任何时候,你认为布局协议不适合你(至少目前来说),我仍然建议你查看 Part2 的这一小—一个有用的调试工具,这个工具可以帮助你使用 SwiftUI ,且不需要理解布局协议就可以使用。...这类型常常被作为视图容器,虽然布局协议是今年新推出的(至少公开来说),但是我们第一天使用 SwiftUI 的时候就在使用了,当每次使用 HStack 或者 VStack 放置视图都是如此。...无论如何,没有缓存的情况下编写我们的布局更简单一点,当我们以后需要再添加。SwiftUI 已经做了一些缓存。例如,从子视图代理获得的值会自动存储缓存中。相同的参数的反复调用将会使用缓存结果。

3.2K10

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

创建一个考虑所有情况的通用布局( 例如:VStack、HStack )是一项相当艰巨的工作。开发者即使无法实现这样的布局容器,也应对各种尺寸需求的定义有清晰的理解。...阅读 The SwiftUI Layout Protocol [11]了解如何创建自定义布局。创建从底部开始的滚动视图Q:我如何实现一个底部对齐的滚动视图, macOS 上会不会有糟糕的性能?...但是,此转换仅在文本字段完成编辑才会发生,并且不会阻止输入非数字字符。目前 SwiftUI 没有 API 可以限制用户字段中输入的字符。...软弃用Q:最近,我注意新的 @ViewBuilder 函数以前的版本中是不可用的,弃用信息提示我使用新的方法取代老方法,这是 SwiftUI 的 API 设计缺陷还是我错过了什么?...这是一个多个版本中都出现过的奇怪问题。 SwiftUI 早期版本中,当在 iOS 中使用系统中文输入法,很容易触发这种情况。但后期逐步得到了修复。

14.7K30

SwiftUI 中用 Text 实现图文混排

欢迎大家 Discord 频道[2] 中进行更多地交流SwiftUI 提供了强大的布局能力,不过这些布局操作都是视图之间进行的。...这意味着,当我们对部分 Text 进行配置,只能使用不改变 Text 类型的修饰器( 该原则同样适用于通过插值方式进行的合并 ),例如:HStack{ let a = Text(str)...另一方面,由于 Image( 非 SF Symbols )的 textBaseline 默认情况下是与其 bottom 一致的,这导致与 Text 中其他的文字进行混排,图片与文字会由于基准线的不同而发生上下错位的情况...从上图中可以看出,动态类型仅对文本有效,Text 中的图片尺寸并不会发生改变。使用 Text 实现图文混排,如果图片不能伴随文本的尺寸变化而变化,就会出现上图中的结果。...image-20220814181138809遗憾的是,由于 frame 会更改 Image 的类型,因此我们无法将通过 frame 动态更改尺寸后的图片嵌入 Text 中,以实现可动态调整尺寸的图文混排

4.2K30

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

前言 最近,我正在开发一个 Dribbble 上找到的设计的 SwiftUI 实现时,我想到了一个点子,可以通过一些酷炫的筛选器扩展该项目以缩小结果列表。...使用 UIKit ,我总是将这种类型的视图实现为具有特定 UICollectionViewFlowLayout 的 UICollectionView。但在 SwiftUI 中该如何实现呢?...如果满足条件,我们将当前项附加到 singleLineResult 中,更新可用的 HStack 行宽,并继续下一个元素。...singleLineResult 可能不会为空,也不会附加到 allLinesResult 中——因为我们只减去项目宽度的结果小于 0 附加 singleLineResult。...最后,提供了一个简单的视图实现,可以 SwiftUI 中使用该选择器。这个选择器可用于创建各种交互式选择界面。 - EOF -

24020

TCA - SwiftUI 的救星?(一)

新建一个 SwiftUI 项目。因为我们会涉及大量测试的话题,所以记得把 “Include Tests” 勾选上。...更新状态并触发渲染 Reducer 闭包中改变状态是合法的,新的状态将被 TCA 用来触发 view 的渲染,并保存下来等待下一次 Action 到来。... SwiftUI 中,TCA 使用 ViewStore (它本身是一个 ObservableObject) 来通过 @ObservedObject 触发 UI 刷新。...因此,如果我们的 View 持有的只是切分后的 Store,那么原始 Store 其他部分的变更,就不会影响当前这个 Store 的切片,从而保证那些和当前 UI 不相关的状态改变,不会导致当前 UI...但是,实际上使用 TCA 做项目,更多的情景我们从更小的模块进行构建 (它会包含自己的一套 Feature),然后再把这些本地内容”添加“它的上级。所以 Store 的切分将会变得自然而然。

3.2K30

如何在 Swift 中取消一个后台任务

异步编程可以提高应用程序的性能,但必须取消不需要的任务,以确保不需要的后台任务不会干扰应用程序。本文演示了如何明确地取消一个任务,并展示了子任务是如何自动取消的。...为什么要取消一个后台任务 与视图的交互可能会触发后台任务的运行,进一步的交互可能会使最初的请求过时,并触发后续的后台任务运行。除了浪费资源外,不取消初始任务可能会导致你的应用程序出现偶现和意外行为。...一个取消按钮被添加到视图中,其点击事件是ViewModel中调用取消方法。...ViewModel中添加了一些日志记录,以便在文件下载增加和文件isDownloading属性被设置为false打印出来。...中的子任务 SwiftUI 中取消和恢复后台任务 结论 异步编程中,重要的是停止任何不需要的后台任务以节省资源并避免后台任务干扰应用程序的任何不良副作用。

2.7K30

干货 | 关于SwiftUI,看这一篇就够了

也就是说,声明一个属性SwiftUI会将当前属性的状态与对应视图的绑定,当属性的状态发生改变的时候,当前视图会销毁以前的状态并及时更新,下面具体分析一下这个过程。...用户交互过程中,会产生一个用户的action,从上图可以看出,SwiftUI中数据的流转过程如下: 该行为触发数据改变,并通过@State数据源进行包装; @State检测到数据变化,触发视图重绘;...不同场景中,SwiftUI提供了不同的关键词,其实现原理上如上文所示: @State - 视图和数据存在依赖,数据变化要同步视图; @Binding - 父子视图直接有数据的依赖,数据变化要同步父子视图...因为, SwiftUI中这些属性的设置在内部都会用一个View来承载,然后布局的时候就会按照上面示例的布局流程,一层层View的计算布局下来,这样做的优点是:方便底层设计渲染函数更容易做到monomorphic...同时SwiftUI中也是支持frame设定,但也不会像UIKit中那样作用于当前元素,在内部也是形成一个虚拟的View来承载frame设定,布局过程中进行frame计算最终显示出想要的结果。

5.7K10

SwiftUI 布局 —— 尺寸( 下 )

本篇中,我们将通过对视图修饰器 frame 和 offset 的仿制进一步加深对 SwiftUI 布局机制的理解,并通过一些示例展示布局需要注意的问题。...,但如果将它们放置其他的布局容器中,你会发现它们容器内的布局后的摆放结果明显不同 —— 需求尺寸的构成和大小不一样( 下图中,用红框标注了各自的需求尺寸 )。...当用布局容器创建合成视图,必须将构成后的合成视图对父容器的布局影响考虑其中。针对不同的需求,选择恰当的容器。...,因此 SwiftUI 中它们分别对应着不同的布局容器。...当 min 或( 和 ) max 有值,会按如下规则返回 _FlexFrameLayout 的该维度上的需求尺寸( 下图来自于 SwiftUI-Lab[6] ) frame-flow-chart

2.6K40

为什么SwiftUI的视图使用结构体?

UIKit中,每个视图都来自一个名为UIView的类,该类具有许多属性和方法:背景色,确定其放置方式的约束,用于将其内容呈现其中的图层等等。...struct or class 通常这不是问题,但是有一个名为UIStackView的特定子类,它类似于SwiftUI中的VStack和HStack。...SwiftUI中,我们所有的视图都是简单的结构体,几乎可以自由创建。想想看:如果您制作一个仅包含一个整数的结构体,则结构体的整个大小就是:一个整数。没有其他的。...得益于现代iPhone的强大功能,我不会慎重考虑后创建1000个整数甚至100,000个整数——眨眼之间就会发生。1000个SwiftUI视图甚至100,000个SwiftUI视图也是如此。...通过生成不会随时间变化的视图,SwiftUI鼓励我们转向更具功能性的设计方法:将数据转换为UI,我们的视图变成简单的,惰性的东西,而不是会失去控制的智能化的东西。

3.1K10

SwiftUI 布局 —— 对齐

WWDC 2022 中,苹果为 SwiftUI 增添了 Layout 协议,让我们有了更多的机会了解和验证 SwiftUI 的布局原理。...比如将书桌上的一摞书摆放整齐,列队训练向左(右)看齐等等。 SwiftUI 中,对齐是指在布局容器中,将多个视图按照对齐指南( Alignment Guide )进行对齐。...因此,布局容器对子视图进行对齐摆放过程中,布局容器的尺寸并没有确定下来,所以不会存在将子视图的对齐指南与容器的对齐指南进行“对齐”的可能。...相对于 ZStack 布局将更加复杂。...overlay、background SwiftUI 中,除了我们熟悉的 VStack、HStack、ZStack 、Grid 、List 外,很多 modifier 的功能也都是通过布局来实现的。

6.3K20

SwiftUI + Core Data App 的内存占用优化之旅

当子视图进入惰性容器的可视区域SwiftUI 会调用它的 onAppear 闭包,子视图退出可视区域,会调用 onDisappear 闭包。...Navigator-Debug 尽管上述优化技巧可能会对滚动的流畅度产生一定的影响( 视觉上不明显 ),不过考虑它所带来的巨大收益,本例中应该是一个相当不错的选择。...它保证了,只真正对数据有需求,才对数据进行获取( 实例化 )。提高了性能的同时,也尽量减少了对内存的占用。 本例中,只有视图首次出现在 List 的可视区域,Item 才会被填充数据。...数据的多份拷贝 当图片数据从 SQLite 经 Core Data 最终通过 SwiftUI 显示,实际上在内存中至少保存了三份拷贝: 行缓存 托管对象上下文( 托管对象被填充后 ) 显示该图片的 SwiftUI...objectID { // 获取 ObjectID 并不会触发惰性填充 let imageData: Data?

1.2K10

SwiftUI + Core Data App 的内存占用优化之旅

当子视图进入惰性容器的可视区域SwiftUI 会调用它的 onAppear 闭包,子视图退出可视区域,会调用 onDisappear 闭包。...图片 尽管上述优化技巧可能会对滚动的流畅度产生一定的影响( 视觉上不明显 ),不过考虑它所带来的巨大收益,本例中应该是一个相当不错的选择。...它保证了,只真正对数据有需求,才对数据进行获取( 实例化 )。提高了性能的同时,也尽量减少了对内存的占用。 本例中,只有视图首次出现在 List 的可视区域,Item 才会被填充数据。...数据的多份拷贝 当图片数据从 SQLite 经 Core Data 最终通过 SwiftUI 显示,实际上在内存中至少保存了三份拷贝: 行缓存 托管对象上下文( 托管对象被填充后 ) 显示该图片的 SwiftUI...objectID { // 获取 ObjectID 并不会触发惰性填充 let imageData: Data?

2.4K40

为什么 SwiftUI 的视图使用结构体

UIKit 中,每个视图都来自一个名为UIView的类,该类具有许多属性和方法:背景色,确定其放置方式的约束,用于将其内容呈现其中的图层等等。...struct or class 通常这不是问题,但是有一个名为 UIStackView 的特定子类,它类似于 SwiftUI 中的 VStack 和 HStack。... SwiftUI 中,我们所有的视图都是简单的结构体,几乎可以自由创建。想想看:如果您制作一个仅包含一个整数的结构体,则结构体的整个大小就是:一个整数。没有其他的。...得益于现代 iPhone 的强大功能,我不会慎重考虑后创建 1000 个整数甚至 100,000 个整数——眨眼之间就会发生。...通过生成不会随时间变化的视图,SwiftUI 鼓励我们转向更具功能性的设计方法:将数据转换为 UI ,我们的视图变成简单的,惰性的东西,而不是会失去控制的智能化的东西。

2.4K50

SwiftUI 布局协议 - Part2

当我们改变角度SwiftUI 会计算好每个视图最初和最终的位置,然后动画期间内修改它们的位置,从A点到B点成一条直线。...你有想过如果动画的角度是从0360会发生什么吗?给你一分钟... 对!...什么都不会发生。开始的位置和结束的位置是一样的,因此就 SwiftUI 而言,没有动画。...现在 SwiftUI 不会为我们插入位置。相反,它会插入角度值。我们的布局代码将会完成剩下的工作。 struct Wheel: Layout { // ......如果 CPU 开始飙升,或许可以 placeSubviews 中添加一条打印语句查看它是否无休止的调用。注意动画也会使 CPU 增长。如果你想测试你的容器是否循环,不要在动画查看 CPU 。...但是,我们也可以组合一些不同布局容器中。在下一个例子中我们将会把前三个视图水平的放置视图顶部,后三个水平的放置底部。剩下的视图将会在中间,垂直排列。

2.7K30
领券