SwiftUI编程思想
[!abstract] SwiftUI编程思想
- 书名: SwiftUI编程思想
- 作者:
- 简介:
- 出版时间
- ISBN:
- 分类:
- 出版社:
- 出版社:
- bookId: CB_0Lw7LU7Mi5x56st6sv85z4LU
高亮划线
视图构建器
- 📌 所有像 Stack 和Grid 这样的容器视图,以及像 background 和 overlay 这样的修饰器中,都采⽤了视图构建器闭包来创建它们的⼦视图。此外,所有视图的 body 属性都被隐式标注了@ViewBuilder,ViewModi!er 协议的 body(content:) ⽅法也是如此 ^CB-0Lw7LU7Mi5x56st6sv85z4LU-3-3049-3266
- ⏱ 2024-12-19 12:56:03
动态内容
📌 Group (以及它的修饰器) 当作 ScrollView 的根视图或者唯⼀⼦视图时,Group 的⾏为就会和 VStack 很像,修饰器也不再会被应⽤到 Group 中每个单独的视图中去。这条规则还有另外⼀个例外,那就是将 Group 放到 overlay 或者background ⾥,这时候它表现得会像是⼀个 ZStack。 ^CB-0Lw7LU7Mi5x56st6sv85z4LU-4-474-704
- ⏱ 2024-12-19 13:03:36
📌 在 SwiftUI ⼤多数地⽅使⽤的是不透明的返回类型some View,这个不透明类型实际上对视图的确切结构进⾏了编码,把复杂的嵌套类型隐藏了起来。视图的类型会准确地指出视图树中哪部分是静态的,哪部分是动态的,这让SwiftUI 可以完全了解哪些视图可能会被动态地插⼊和删除。 ^CB-0Lw7LU7Mi5x56st6sv85z4LU-4-2103-2244
- ⏱ 2024-12-19 13:04:51
生命周期
- 📌 当⼀个节点被从渲染树中移除时,它所关联的状态也会全部消失 ^CB-0Lw7LU7Mi5x56st6sv85z4LU-6-1260-1288
- ⏱ 2024-12-19 13:08:01
身份标识
📌 即使实在懒加载的 stack 中,渲染树中的节点在离开屏幕后也还是会被保留,以维持它们的状态 ^CB-0Lw7LU7Mi5x56st6sv85z4LU-7-909-955
- ⏱ 2024-12-19 13:10:15
📌 task 是前⾯两者与异步操作的结合。这个修饰器在 onAppear 会被调⽤的时间点创建⼀个新的异步任务 (task),并在 onDisappear 将被调⽤的时候取消这个任务。 ^CB-0Lw7LU7Mi5x56st6sv85z4LU-7-2211-2383
- ⏱ 2024-12-19 13:11:55
状态和绑定
- 📌 在 iOS 17 中,SwiftUI 与对象交互的⽅式已经完全改变。SwiftUI 不再依赖Combine 框架进⾏观察,⽽是采⽤基于宏的解决⽅案,这也使得 @StateObject 和@ObservedObject 属性包装器变得不再必要 ^CB-0Lw7LU7Mi5x56st6sv85z4LU-8-2506-2789
- ⏱ 2024-12-20 12:39:09
Observable 宏
📌 视图的状态是和它的身份标识所关联的,⽽在初始化⽅法运⾏的时候,视图还没有身份标识。 ^CB-0Lw7LU7Mi5x56st6sv85z4LU-10-871-912
- ⏱ 2024-12-20 13:04:45
📌 Observable 宏做的事情有两件:→ 它会为所附加的类型添加遵守 Observable 标记协议的声明。这是⼀个空协议,⽤于在编译时标记⼀个类,它在运⾏时没有实际的作⽤。→ 它修改对象的属性,以追踪读取和写⼊访问。不管对象存储在哪⾥,也不需要任何特殊的属性包装器,只需访问 Observable对象的属性,对它的观察就⾃动建⽴了。因此,我们只需要使⽤ @State 属性包装器,并与Observable 对象结合起来,就可以更改对象的⽣命周期管理⽅式了 ^CB-0Lw7LU7Mi5x56st6sv85z4LU-10-2578-3345
- ⏱ 2024-12-20 13:08:45
📌 存在两种使⽤⽅式:→ 想要将 Observable 对象的⽣命周期与视图的渲染节点的⽣命周期 (换句话说,它是视图私有的对象) 关联起来,我们使⽤ @State 属性包装器来声明属性。→ 想要使⽤具有独⽴于视图的渲染节点的⽣命周期的对象 (换句话说,我们从外部传递的对象),我们只需将它存储在普通属性中。 ^CB-0Lw7LU7Mi5x56st6sv85z4LU-10-3346-3982
- ⏱ 2024-12-20 13:10:35
State 和 Observable
- 📌 现在,计数器视图本身不再维护模型对象的⽣命周期了。当我们传⼊⼀个新值时,新的视图模型将被构建,并且视图的 body 将使⽤这个新对象来渲染⾃身。 ^CB-0Lw7LU7Mi5x56st6sv85z4LU-11-4602-4674
- ⏱ 2024-12-24 13:06:47
Observable 宏的工作方式
📌 但⽆论如何,在视图中,如果模型属性没有使⽤ @State 声明,那么视图模型的⽣命周期必须要在视图之外的某个地⽅进⾏管理。 ^CB-0Lw7LU7Mi5x56st6sv85z4LU-12-645-706
- ⏱ 2024-12-24 13:07:40
📌 withMutation(keyPath ^CB-0Lw7LU7Mi5x56st6sv85z4LU-12-1907-1927
- ⏱ 2024-12-24 13:08:39
📌 我们可以想象,在执⾏视图的 body 时,SwiftUI 做了类似这样的操作:withObservationTracking { view.body} onChange: {view.needsUpdate()}通过这样做,我们在视图的 body 中对任何可观察属性的访问都会 (直接或间接地) 通过对象的观察注册器,并形成该特定属性和当前正在执⾏的视图body 之间的依赖关系。 ^CB-0Lw7LU7Mi5x56st6sv85z4LU-12-4832-5337
- ⏱ 2024-12-24 13:10:32
ObservableObject 协议
- 📌 协议,并组合使⽤ @StateObject 或者 @ObservedObject 属性包装器,来观察对象的状态变 ^CB-0Lw7LU7Mi5x56st6sv85z4LU-13-678-899
- ⏱ 2024-12-21 14:30:13
Observed Object
- 📌 它所做的事情,就只有订阅这个对象的 objectWillChange publisher,并且在这个 publisher 发出事件时重新渲染视图。这些特性决定了,当我们 (把 iOS 17 之前的版本作为⽬标平台) 想要明确地从外部将对象传递到视图内部时,@ObservedObject 是唯⼀正确的⼯具。这和⼀个普通属性中的 Observable 对象是等价的。 ^CB-0Lw7LU7Mi5x56st6sv85z4LU-14-1887-2133
- ⏱ 2025-01-03 12:47:07
读书笔记
视图构建器
划线评论
- 📌 SwiftUI 使⽤⼀种特殊的视图构建器 (view builder) 语法来构建视图的列表。视图构建器是建⽴在 Swift 的结果构建器(result builder) 特性之上的,这个特性是专⻔为了构建视图才被添加到语⾔中的 ^37417557-7WykaWoyl
- 💭 新版swift引入了 repeat each (parameter pack)避免写冗长的重载代码
- ⏱ 2024-12-19 12:54:39
划线评论
- 📌 这会为视图列表中的每个元素添加边框,也就是说,图⽚和⽂本都拥会有各⾃的边框。我们经常会在使⽤ Group 时遇到这个⾏为,它所抽象的其实是⼀个和布局⽆关的视图构建器 ^37417557-7WykGC8bH
💭 tupleview和Group行为类似
⏱ 2024-12-19 13:02:27
State
划线评论
- 📌 @State 属性包装器是将状态引⼊到 SwiftUI app 中最简单的⽅式。它⽤于私有的视图状态值 ^37417557-7WzPCazwX
- 💭 强调下是私有的。 不能用外部传入值的方式初始化
- ⏱ 2024-12-20 12:41:21
划线评论
- 📌 现在我们可以从外部传⼊值,但因为在视图的初始化⽅法中我们⽆法访问状态的当前值,这个传⼊值只会改变状态属性的初始值。⼀旦该视图的节点在渲染树中被创建,传⼊不同的初始值将没有任何效果,或者⾄少不是我们所期望的效果。这⾥发⽣的只是初始值 (⽽不是实际值) 的改变,只有当节点被移除并重新插⼊到渲染树中时,这个初始值才会产⽣影响。 ^37417557-7WzQJQw6N
- 💭 _value = State(initialValue: value)
- ⏱ 2024-12-20 12:58:31