【问题标题】:SwiftUI - Using 'ObservableObject' and @EnvironmentObject to Conditionally Display ViewSwiftUI - 使用“ObservableObject”和@EnvironmentObject 有条件地显示视图
【发布时间】:2019-08-14 04:49:48
【问题描述】:

我想有条件地在我的应用程序中显示不同的视图 - 如果某个布尔值为真,则将显示一个视图。如果为 false,将显示不同的视图。此布尔值在 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。有人有解决方案吗?谢谢!

【问题讨论】:

    标签: swift class struct observable swiftui


    【解决方案1】:

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

    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")
        }
    }
    

    【讨论】:

    • 抱歉,我不得不重命名问题的所有内容,所以这些错误不在我的实际代码中。当我运行应用程序并按下QuestionView 中的按钮时,什么也没有发生(尽管应该显示ResultView)。我用这些说明编辑了我的问题。
    • 当您调用 .environmentObject() 时,您正在创建一个新的 PracticeStatus(),它与 ​​if 语句中使用的不同。检查我的代码,看看你应该怎么做。另外,它是多余的,你已经设置了你的 environemntObject。你没有吗?您不需要在每个视图中都设置它。这就是环境对象的好处。
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 2020-05-17
    相关资源
    最近更新 更多