使用ObservableObject
和@Binding
- 代码实现思路:
- 首先,定义一个符合
ObservableObject
协议的视图模型,在其中存储复杂数据结构。
- 父视图将该视图模型实例传递给子视图,并使用
@Binding
将子视图中需要修改的数据绑定到父视图中的数据。
- 子视图通过修改绑定的数据,自动通知父视图进行更新。
- 关键代码片段:
import SwiftUI
// 定义一个符合ObservableObject协议的视图模型
class ComplexDataViewModel: ObservableObject {
@Published var complexData: [String: [Int]] = ["key1": [1, 2, 3]]
}
struct ChildView: View {
// 使用@Binding绑定父视图传递过来的数据
@Binding var subData: [Int]
var body: some View {
Button("Modify Data") {
subData.append(subData.count + 1)
}
}
}
struct ParentView: View {
@StateObject var viewModel = ComplexDataViewModel()
var body: some View {
VStack {
ChildView(subData: $viewModel.complexData["key1"]!)
Text("Data in Parent: \(viewModel.complexData["key1"]!.description)")
}
}
}
使用EnvironmentObject
- 代码实现思路:
- 同样定义一个符合
ObservableObject
协议的视图模型来存储复杂数据结构。
- 在父视图的
environmentObject
中注入该视图模型实例,这样子视图可以通过@EnvironmentObject
获取到该实例。
- 子视图对数据的修改会触发视图模型的
@Published
属性更新,从而使依赖该数据的所有视图(包括父视图)进行更新。
- 关键代码片段:
import SwiftUI
// 定义一个符合ObservableObject协议的视图模型
class ComplexDataViewModel: ObservableObject {
@Published var complexData: [String: [Int]] = ["key1": [1, 2, 3]]
}
struct ChildView: View {
// 使用@EnvironmentObject获取父视图注入的视图模型
@EnvironmentObject var viewModel: ComplexDataViewModel
var body: some View {
Button("Modify Data") {
viewModel.complexData["key1"]?.append(viewModel.complexData["key1"]!.count + 1)
}
}
}
struct ParentView: View {
@StateObject var viewModel = ComplexDataViewModel()
var body: some View {
VStack {
ChildView()
.environmentObject(viewModel)
Text("Data in Parent: \(viewModel.complexData["key1"]!.description)")
}
}
}