问题

  1. view 和 data 怎么 two-way 绑定,View怎么跟随Data的变化进行刷新
  2. view 和 data 声明周期
  3. 不同view之间怎么share data
  4. @State @Binding @StateObject @Obapproachserver初始化失败是怎么解决ableObject @Observere线程池dObject @EnvirmentObject 差异

为什么需求SwiftUI

graph TD
Code --> initialView 
Code --> updateView
updateView --> updateVieww
updateView --> updateData

平时咱们在code页面代码的时分,codepath并不是单一路径的,许多情况下,datapplea和view不统一导致问题的发生。
为了初始化电脑时出现问题编写维护性更高的代码。

graph TD
code --> data 
data --> view

siggle code path,线程是什么意思应呼声而出。
咱们运用SappetitewiftUI并不是说为了优化多少性能,而是提高代码的可维护性。运用框架防止问题的的发生。

SwiftUI的根本结构

struct SomeView: View {
    var body: some View {
        Text(" some view ")
    }
}

一切的视图组件都是value类型的struct,随时随地rebuild.
假如这样的struct持有页面状况,当页初始化电脑时出现问题未进行更改面刷新的时分,一切的状况是否都会回归到默许状况?

这时分就需求咱们property wrapper登场了

struct SomeView: View {
    @State var someState = false
    var someValue = ""
    var body: some View {
        Text(" some view ")
    }
}

@State @Binding

graph TD
ContentView --> SomeView持有someValue
ContentViewObject --> SomeViewObject持有someState
  1. @State修饰的apple特点,不会由视图保存,而APP是另外保存。线程池所以让视swift代码图rebuild的时分,视图的状况也不会丢失。
  2. 由于Swift中的特点都是值类型,所以假如多个视图想share state怎么办?
    这时分就需求@binding 拿到 @state的引证。来sh初始化游戏启动器失败are data.
struct SomeView: View {
    @State var someState = false
    var body: some View {
        OtherView(someState: $someState)
    }
}
struct OtherView: View {
    @Binding var someState: Bool
    var body: some View {
        Text("")
    }
}

假如我有许多State,假如处理?
这儿就引进StateObject的概念

@StateObjapplicationect @Obser线程数是什么vedObject ObservableObject

类比@State声明单一特点application,@StateObject可以application修饰一个杂乱的状况目标。状况目标里面的特点是否是State,可以足有控制。

  1. 遵循ObservableObject协议,运用@puapproachblished来Wrapper需求呼应视图呼应的特点
  2. valueswift是什么 changed 必须在主线程
// 声明一个complexObject
class ComplexObject: ObservableObject {
    // 可相应视图rebuild的state
    @Published var someState = false
    var someValue = true
}
// 持有complexObject
struct SomeView: View {
    @StateObject var someStateObject = ComplexObject()
    var body: some View {
        OtherView(someStateObject: someStateObject)
    }
}
// 仅运用
struct OtherView: View {
    @ObservedObject var someStateObject: ComplexObject
    var body: some View {
        Text("")
    }
}

这儿有几个点讲一下

Q:为什么ComplexObject运用class

A: 由于ObservableObject必须遵循AnyObject,必须是class

Q: share State 不运用 $ 符号了

A: 由于是class,原本便是引证类型

Q: StateObject 和 ObservedObject的差异

A: 相似State 和 Binding,一个是持有运用状况,一个仅仅是运用状况

多视图share state需求视图初始化一个一个传递,也太麻烦了。所以引出咱们的@EnvironmentObject

@EnvironmentObject

// 声明一个complexObject
class ComplexObject: ObservableObject {
    // 可相应视图rebuild的state
    @Published var someState = false
    var someValue = true
}
// 持有complexObject
struct SomeView: View {
    @StateObject var someStateObject = ComplexObject()
    var body: some View {
        //>>>>>>>>>>>>>>>>>>>>>>>看这儿>>>>>>>>>>
        OtherView()
            .environmentObject(someStateObject)
        //
    }
}
// 仅运用
struct OtherView: View {
    //>>>>>>>>>>>>>>>>>>>>>>看这儿
    @EnvironmentObject var someStateObject: ComplexObject
    var body: some View {
        Text("")
    }
}
  1. 运用environmentObject的midifapproveier注入目标
  2. 从EnviswifterronmeAPPntObject取出目标

简单粗暴

参考

whats-the-difference-between-observedobject-state-and-environmentobject