SwiftUI - 使用“ObservableObject”和@EnvironmentObject

2019-09-30 03:19发布

我想有条件地显示在我的应用程序不同的观点 - 如果某个布尔是真实的,一个视图就会显示出来。 如果是假的,有不同的看法将被显示。 该布尔是ObservableObject类中,并且从将要显示的视图中的一个改变。

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

Answer 1:

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

  1. 可变practice不存在中PracticeView 。 你的意思是practiceStatus
  2. 可变userData不存在QuestionView 。 你的意思是practiceStatus
  3. 要调用PracticeView从内PracticeView ! 你会definetely得到一个堆栈溢出;-)没有你的意思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")
    }
}


文章来源: SwiftUI - Using 'ObservableObject' and @EnvironmentObject to Conditionally Display View