有没有办法根据 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:如何根据滚动视图的用户当前滚动位置同步/更改进度条进度?