有没有办法根据 SwiftUI 中的环境变量更改视图?

Posted

技术标签:

【中文标题】有没有办法根据 SwiftUI 中的环境变量更改视图?【英文标题】:Is there a way to change views based off of Environment Variables in SwiftUI? 【发布时间】:2019-12-10 23:18:40 【问题描述】:

我希望能够通过点击按钮来更改 SwiftUI 中的视图。我有按钮设置来切换环境变量,如下所示

struct SettingsButton: View 

    @EnvironmentObject var settings: UserSettings

    var body: some View 
        VStack 
            Button(action:  self.settings.settingsView.toggle() ) 
                Image(systemName: "gear")
                    .font(Font.system(size: 25))
                    .frame(width: 25, height: 25)
                    .foregroundColor(.primary)
                    
                
                .offset(x: 180, y: -372)
        

我也在这里声明了 Observable 对象

import Foundation
import GoogleSignIn

class UserSettings: ObservableObject 
    @Published var studentID = ""
    @Published var givenName = ""
    @Published var settingsView = false
    @Published var profileView = false
    @Published var isLogged = GIDSignIn.sharedInstance()?.currentUser

最后,我在视图中有一个 ViewBuilder 设置,该设置在开始时加载以监听变量的变化并相应地切换视图,但是当加载应用程序并点击按钮时,应用程序冻结并保持无响应。

struct Login: View 

    @EnvironmentObject var settings: UserSettings

    @ViewBuilder var body : some View 

        if settings.isLogged != nil 
            MainView()
        
        else 
            LoginPage()
        
        if settings.settingsView 
            SettingsView()
        

    

我想知道是否有任何已知方法可以在不使用 .sheet 或导航链接的情况下尝试此操作,非常感谢!

【问题讨论】:

【参考方案1】:

没有看到你的MainView(), LoginPage() and SettingsView() 我认为你应该在你的Login() 视图中做这样的事情:

我在你的观点周围添加了VStack

struct Login: View 
    @EnvironmentObject var settings: UserSettings

    @ViewBuilder var body: some View 
        VStack 
            if settings.isLogged != nil 
                MainView()
             else 
                LoginPage()
            
            if settings.settingsView 
                SettingsView()
            
        
    

还要确保您的SceneDelegate 中有以下内容,因为您的UserSettings() 被定义为EnvironmentObject

// Create the SwiftUI view that provides the window contents.
let contentView = Login()
    .environmentObject(UserSettings())

【讨论】:

VStack 防止它变得无响应,但是它只是堆叠视图而不是替换之前的视图 @SeanOplinger 这完全取决于你的条件。

以上是关于有没有办法根据 SwiftUI 中的环境变量更改视图?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法从 SwiftUI 中的 ButtonStyle 获取 isDisabled 状态?

选择器更改时,SwiftUI 环境变量中的字符串插值未更新

SwiftUI:如何根据滚动视图的用户当前滚动位置同步/更改进度条进度?

在 VueJS 中更改环境变量后,有没有办法热重载我的 Vue 页面?

SwiftUI 如何根据获取的数据更改视图的背景颜色?

有没有办法在 SwiftUI 中“取消绑定”变量/对象