我有 2 个视图,但我无法让数据流与带有 @Environment 对象的 Picker 一起工作,我总是会因崩溃而出现致命错误,但我已经在预览和 ResultView 中声明了环境对象。
第一眼看起来像这样
import SwiftUI
@MainActor class DataExample : ObservableObject {
@Published var testnumber = "Test"
}
struct PickerView: View {
@StateObject var data = DataExample()
var body: some View {
VStack {
Picker(
selection: $data.testnumber,
label: Text("PickerName"),
content: {
Text("John").tag("John")
.foregroundColor(.black)
Text("Freddy").tag("Freddy")
.foregroundColor(.black)
Text("Becky").tag("Becky")
.foregroundColor(.black)
})
.frame(width: 120, height: 45)
.pickerStyle(.wheel)
}
.environmentObject(data)
}
}
struct PickerView_Previews: PreviewProvider {
static var previews: some View {
PickerView()
}
}
第二视图看起来像这样
import SwiftUI
struct PickerResultView: View {
@EnvironmentObject var data : DataExample
var body: some View {
HStack {
PickerView()
Text("\(data.testnumber)")
.environmentObject(data)
}
}
}
struct PickerResultView_Previews: PreviewProvider {
static var previews: some View {
PickerResultView()
.environmentObject(DataExample())
}
}
也许有人可以指出我的问题。
上面是使用环境对象的示例。该对象必须位于将访问它的视图层次结构的顶部。例如,我将它放在 ContentView 级别,但它可能会更低,具体取决于应用程序。环境对象正在创建共享实例:
@main
struct yourApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(DataExample())
}
}
}
这是为访问上面的环境对象而修改的示例代码。 PickerView 和 PickerResultView 这两个视图可以独立使用:
struct ContentView: View {
var body: some View {
TabView {
ResultsView()
.tabItem {
Label("Result", systemImage: "folder")
}
SettingsView()
.tabItem {
Label("Settings", systemImage: "gearshape")
}
}
}
}
struct ResultsView: View {
var body: some View {
ZStack {
Color.teal.ignoresSafeArea()
PickerResultView()
}
}
}
struct SettingsView: View {
var body: some View {
ZStack {
Color.orange.ignoresSafeArea()
PickerView()
}
}
}
@MainActor class DataExample : ObservableObject {
@Published var testnumber = "Test"
}
struct PickerView: View {
@EnvironmentObject var data: DataExample
var body: some View {
VStack {
Picker(
selection: $data.testnumber,
label: Text("PickerName"),
content: {
Text("John").tag("John")
.foregroundColor(.black)
Text("Freddy").tag("Freddy")
.foregroundColor(.black)
Text("Becky").tag("Becky")
.foregroundColor(.black)
})
.frame(width: 120, height: 45)
.pickerStyle(.wheel)
}
}
}
struct PickerResultView: View {
@EnvironmentObject var data: DataExample
var body: some View {
HStack {
Text("\(data.testnumber)")
}
}
}
结果看起来像这样,其中使用 pickerview(橙色)进行更改并且更改反映在应用程序的其他部分(青色):