SwiftUI-使用'ObservableObject'和@EnvironmentObject有条件地显示视图 [英] SwiftUI - Using 'ObservableObject' and @EnvironmentObject to Conditionally Display View

查看:305
本文介绍了SwiftUI-使用'ObservableObject'和@EnvironmentObject有条件地显示视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在应用程序中有条件地显示不同的视图-如果某个布尔值为true,则将显示一个视图。如果为假,将显示其他视图。此布尔值在ObservableObject类中,并且从将要显示的视图之一中更改。

I would like to conditionally display different views in my application - if a certain boolean is true, one view will be displayed. If it is false, a different view will be displayed. This boolean is within an ObservableObject class, and is changed from one of the views that will be displayed.

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

However, this code doesn't work. When the button within QuestionView is pressed, ResultView is not displayed. Does anybody have a solution? Thanks!

推荐答案

您是否尝试过编译代码?有几个基本错误:

Have you tried to compile your code? There are several basic errors:


  1. 变量做法在<$ c中不存在$ c> PracticeView 。您是说 practiceStatus 吗?

  2. 变量 userData 在<$中不存在c $ c> QuestionView 。您是说 practiceStatus 吗?

  3. 您是从<$内部调用 PracticeView c $ c> PracticeView !您肯定会得到堆栈溢出;-)您不是在说 QuestionView 吗?

  1. Variable practice does not exist in PracticeView. Did you mean practiceStatus?
  2. Variable userData does not exist in QuestionView. Did you mean practiceStatus?
  3. You are calling PracticeView from inside PracticeView! You'll definetely get a stack overflow ;-) Didn't you mean 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-使用'ObservableObject'和@EnvironmentObject有条件地显示视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆