如何在 swift 中实现观察者
How to implement observer in swift
我有以下项目,它在 swift 中实现了一个观察者,以便在两个视图之间传递数据。
型号
import Foundation
class ModelData : ObservableObject {
@Published var number: Int = 1
}
视图 1
import Foundation
import SwiftUI
struct SliderView: View {
@State private var text = "1"
@State private var isEditing = false
@State private var celsius: Double = 1
@StateObject var modelData = ModelData()
var body: some View {
VStack {
VStack {
Text("Number from slider: \(Int(round(celsius)), specifier: "%d")")
Slider(value: $celsius,
in: 1...20, step:1.0)
}.onChange(of: celsius) { _ in
self.text = String(Int(round(celsius)))
self.modelData.number = Int(round(celsius))
}
HStack {
Text("Number")
Spacer()
Text(String(text))
}.padding()
}
}
}
struct SliderView_Previews: PreviewProvider {
static var previews: some View {
SliderView()
}
}
视图 2
import SwiftUI
struct SettingsView: View {
@ObservedObject var modelData = ModelData()
var body: some View {
ZStack {
Color.red
VStack {
Image("Settings")
.foregroundColor(.blue)
.font(.system(size: 100.0))
Text(String(format: "Number is %d ", modelData.number))
}
}
}
}
当 SliderView 中的数据发生变化时,SettingsView 不会更新,它仍保留 ModelData 的默认值。
此致,
奥勒良
在您 TabView
的视图中,
声明 @StateObject var modelData = ModelData()
并使用 .environmentObject(modelData)
.
将其传递给 View1
在 View1
中使用 @EnvironmentObject var modelData: ModelData
。对 View2
.
做同样的事情
我有以下项目,它在 swift 中实现了一个观察者,以便在两个视图之间传递数据。
型号
import Foundation
class ModelData : ObservableObject {
@Published var number: Int = 1
}
视图 1
import Foundation
import SwiftUI
struct SliderView: View {
@State private var text = "1"
@State private var isEditing = false
@State private var celsius: Double = 1
@StateObject var modelData = ModelData()
var body: some View {
VStack {
VStack {
Text("Number from slider: \(Int(round(celsius)), specifier: "%d")")
Slider(value: $celsius,
in: 1...20, step:1.0)
}.onChange(of: celsius) { _ in
self.text = String(Int(round(celsius)))
self.modelData.number = Int(round(celsius))
}
HStack {
Text("Number")
Spacer()
Text(String(text))
}.padding()
}
}
}
struct SliderView_Previews: PreviewProvider {
static var previews: some View {
SliderView()
}
}
视图 2
import SwiftUI
struct SettingsView: View {
@ObservedObject var modelData = ModelData()
var body: some View {
ZStack {
Color.red
VStack {
Image("Settings")
.foregroundColor(.blue)
.font(.system(size: 100.0))
Text(String(format: "Number is %d ", modelData.number))
}
}
}
}
当 SliderView 中的数据发生变化时,SettingsView 不会更新,它仍保留 ModelData 的默认值。
此致, 奥勒良
在您 TabView
的视图中,
声明 @StateObject var modelData = ModelData()
并使用 .environmentObject(modelData)
.
View1
在 View1
中使用 @EnvironmentObject var modelData: ModelData
。对 View2
.