SwiftUI-属性更改时视图不刷新

SwiftUI-属性更改时视图不刷新,swiftui,Swiftui,我非常感谢任何帮助,我只是一个初学者,所以我不确定我是否误解了,或者实现错误,或者这是一个bug 成功登录后,我正试图让我的MacOS应用程序转到主屏幕。我有一个appState与应用程序的其余部分共享状态。AppState是一个符合Observable对象的类,我在isLoggedIn属性更改时添加了一个observer来打印: class AppState : ObservableObject { @Published var isLoggedIn = false { didSet

我非常感谢任何帮助,我只是一个初学者,所以我不确定我是否误解了,或者实现错误,或者这是一个bug

成功登录后,我正试图让我的MacOS应用程序转到主屏幕。我有一个appState与应用程序的其余部分共享状态。AppState是一个符合Observable对象的类,我在isLoggedIn属性更改时添加了一个observer来打印:

class AppState : ObservableObject {
@Published var isLoggedIn = false {
    didSet {
        print("AppState isLoggedin: \(isLoggedIn)")
    }
}
}
我还有一个MasterView结构来处理主视图的更改

struct MasterView: View {

@ObservedObject var appState: AppState = AppState()

var body: some View {

    return Group {

        if appState.isLoggedIn { 
            NavView()  
        } else { 
            LoginView()        
        }

    }.frame(width: 1200, height: 800)
}
}
我有一大堆代码来处理登录,为了简洁起见,我不会发布这些代码,我只想说它是有效的,isLoggedIn被设置为true,并在成功登录后打印到控制台。问题是视图从未更新以反映这一点,所以我仍然停留在登录屏幕上

非常感谢您的帮助,我在这方面花的时间比我愿意承认的要多。谢谢

更新:我记得@EnvironmentObject有问题,所以我切换到@observeObject和@Published。在重新实现@EnvironmentObject之后,我现在想起了原因:我有一个导致崩溃的网络类,因为它不是祖先视图。根据Paul Hudson的评论,“注意:环境对象必须由祖先视图提供–如果SwiftUI找不到正确类型的环境对象,您将遇到崩溃。这也适用于预览,所以要小心。”


我找到了答案,使用下面的代码

AppState:

final class AppState : ObservableObject {

@Published var isLoggedIn = false {
    didSet {
        print("AppState isLoggedIn: \(isLoggedIn)")
    }
}
}
内容视图:

struct ContentView: View {

@ObservedObject var appState: AppState

var body: some View {

return Group {

    if appState.isLoggedIn {     
        MainView(appState: appState)        
    } else {      
      LoginView(appState: appState)      
    }

}.frame(maxWidth: 1200, maxHeight: 800)
}
}
登录视图:

struct LoginView: View {

@ObservedObject var appState: AppState

var body: some View {

Button(action: {
               withAnimation {
                   self.appState.isLoggedIn.toggle()
               }
           }) {
               Text("Go to Main View")
           }.padding()
}
}
最后,主要观点:

struct MainView: View {

@ObservedObject var appState: AppState

var body: some View {

Button(action: {
    withAnimation {
        self.appState.isLoggedIn.toggle()
    }
}) {

    Text("Back To Login View")
}.padding()
}
}

不确定这是否有用,但您是否尝试过将
appState
设置为
EnvironmentObject
?每次视图刷新时,您似乎都在创建它的新实例。很好的呼叫,谢谢。我现在就试试这个,并用我的发现更新帖子。