Skip to content

SwiftUI编程思想

[!abstract] SwiftUI编程思想

  •  SwiftUI编程思想|200
  • 书名: 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

本书评论