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。有人有解决办法吗?谢谢!

你试过编译你的代码吗?有几个基本错误:

  1. PracticeView 中不存在变量 practice。您是说 practiceStatus 吗?
  2. QuestionView 中不存在变量 userData。您是说 practiceStatus 吗?
  3. 您正在从 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")
    }
}