SwiftUI - 使用 'ObservableObject' 和 @EnvironmentObject 有条件地显示视图
SwiftUI - Using 'ObservableObject' and @EnvironmentObject to Conditionally Display View
我想在我的应用程序中有条件地显示不同的视图 - 如果某个布尔值为真,将显示一个视图。如果为假,将显示不同的视图。此布尔值位于 ObservableObject class 内,并从将要显示的视图之一更改而来。
PracticeStatus.swift(父视图)
import Foundation
import SwiftUI
import Combine
class PracticeStatus: ObservableObject {
@Published var showResults:Bool = false
}
PracticeView.swift(父视图)
struct PracticeView: View {
@EnvironmentObject var practiceStatus: PracticeStatus
var body: some View {
VStack {
if practiceStatus.showResults {
ResultView()
} else {
QuestionView().environmentObject(PracticeStatus())
}
}
}
}
QuestionView.swift
struct QuestionView: View {
@EnvironmentObject var practiceStatus: PracticeStatus
var body: some View {
VStack {
...
Button(action: {
self.practiceStatus.showResults = true
}) { ... }
...
}
}
}
但是,此代码不起作用。当按下 QuestionView
中的按钮时,不显示 ResultView。有人有解决办法吗?谢谢!
你试过编译你的代码吗?有几个基本错误:
PracticeView
中不存在变量 practice
。您是说 practiceStatus
吗?
QuestionView
中不存在变量 userData
。您是说 practiceStatus
吗?
- 您正在从
PracticeView
内部呼叫 PracticeView
!你肯定会得到堆栈溢出 ;-) 你不是说 QuestionView
吗?
下面是一个工作代码:
import Foundation
import SwiftUI
import Combine
class PracticeStatus: ObservableObject {
@Published var showResults:Bool = false
}
struct ContentView: View {
@State private var flag = false
var body: some View {
PracticeView().environmentObject(PracticeStatus())
}
}
struct PracticeView: View {
@EnvironmentObject var practiceStatus: PracticeStatus
var body: some View {
VStack {
if practiceStatus.showResults {
ResultView()
} else {
QuestionView()
}
}
}
}
struct QuestionView: View {
@EnvironmentObject var practiceStatus: PracticeStatus
var body: some View {
VStack {
Button(action: {
self.practiceStatus.showResults = true
}) {
Text("button")
}
}
}
}
struct ResultView: View {
@State private var flag = false
var body: some View {
Text("RESULTS")
}
}
我想在我的应用程序中有条件地显示不同的视图 - 如果某个布尔值为真,将显示一个视图。如果为假,将显示不同的视图。此布尔值位于 ObservableObject class 内,并从将要显示的视图之一更改而来。
PracticeStatus.swift(父视图)
import Foundation
import SwiftUI
import Combine
class PracticeStatus: ObservableObject {
@Published var showResults:Bool = false
}
PracticeView.swift(父视图)
struct PracticeView: View {
@EnvironmentObject var practiceStatus: PracticeStatus
var body: some View {
VStack {
if practiceStatus.showResults {
ResultView()
} else {
QuestionView().environmentObject(PracticeStatus())
}
}
}
}
QuestionView.swift
struct QuestionView: View {
@EnvironmentObject var practiceStatus: PracticeStatus
var body: some View {
VStack {
...
Button(action: {
self.practiceStatus.showResults = true
}) { ... }
...
}
}
}
但是,此代码不起作用。当按下 QuestionView
中的按钮时,不显示 ResultView。有人有解决办法吗?谢谢!
你试过编译你的代码吗?有几个基本错误:
PracticeView
中不存在变量practice
。您是说practiceStatus
吗?QuestionView
中不存在变量userData
。您是说practiceStatus
吗?- 您正在从
PracticeView
内部呼叫PracticeView
!你肯定会得到堆栈溢出 ;-) 你不是说QuestionView
吗?
下面是一个工作代码:
import Foundation
import SwiftUI
import Combine
class PracticeStatus: ObservableObject {
@Published var showResults:Bool = false
}
struct ContentView: View {
@State private var flag = false
var body: some View {
PracticeView().environmentObject(PracticeStatus())
}
}
struct PracticeView: View {
@EnvironmentObject var practiceStatus: PracticeStatus
var body: some View {
VStack {
if practiceStatus.showResults {
ResultView()
} else {
QuestionView()
}
}
}
}
struct QuestionView: View {
@EnvironmentObject var practiceStatus: PracticeStatus
var body: some View {
VStack {
Button(action: {
self.practiceStatus.showResults = true
}) {
Text("button")
}
}
}
}
struct ResultView: View {
@State private var flag = false
var body: some View {
Text("RESULTS")
}
}