繁体   English   中英

尝试传递 state 变量以自动更新 SwiftUI 中的视图

[英]Trying to pass state variable to automatically update view in SwiftUI

我有一个变量,它保存 state 的某种类型的 session 是否处于活动状态。 这用于确定显示哪个视图。 我想让我的view model发一个文档,切换这个state,然后自动更新view。 但是,视图没有更新。

所以这是我所拥有的视图的基础层。 sessionState一开始是false,默认是StartSessionView,初始化一个session,如果是active,就去GroupSessionView。

struct SessionView: View {
    @State var sessionState = false

    @ViewBuilder
    var body: some View {
        if sessionState {
            StartSessionView(sessionState: $sessionState)
        } else {
            GroupSessionView(sessionState: $sessionState)
        }
    }
}

StartSessionView 页面具有以下代码。 这里重要的是 sessionManager 视图 model。我使用 Session object(不重要,因为该部分正在工作)和 sessionState 初始化 SessionManager。

struct StartSessionView: View {
    @State var sessionManager = SessionManager(session: Session(sessionType: ""), sessionState: false)
    @ObservedObject var userViewModel = AuthViewModel()
       
    @Binding var sessionState: Bool
            
    var body: some View {
        VStack(alignment: .leading, spacing: 40) {
            Button {
                sessionManager = SessionManager(session: Session(sessionType: dropdownValue), sessionState: sessionState)
                sessionManager.startSession()
                
                
            } label: {
                Text("Do stuff")      
            }
   
        }
    }
}

最后,这是视图 model。

class SessionManager: ObservableObject {

    @State var sessionState: Bool
    let session: Session
    
    init(session: Session, sessionState: Bool) {
        self.session = session
        self.sessionState = sessionState
    }
    
    func startSession() {
        
        var messageData = ["sessionType": session.sessionType]
        
        let document = Firestore.firestore()
            .collection("sessions")
            .document()
        
        document.setData(messageData) {error in
            if let error = error {
                print(error)
                return
            } else { sessionState.toggle }
 
            
        }
        
    }
}

因此,当在这里切换 sessionState 时,我希望将其传递回 SessionView 结构,看到 sessionState = true,并将 go 传递给 GroupSessionView。 我不确定如何通过这么多层传递这些数据。

哎呀,看来你错过了什么。 @State only works with variable, structs.. and not a class in this case 如果你想将数据传递给另一个视图,你可以使用 SwiftUI 中的环境。

        struct SessionView: View {
            @State var sessionState = false
            @StateObject var someThingKeepManager = SomeThingKeepManager()
            @ViewBuilder
            var body: some View {
                ZStack {
                    if sessionState {
                        StartSessionView(sessionState: $sessionState)
                    } else {
                        GroupSessionView(sessionState: $sessionState)
                    }
                }
                .environmentObject(someThingKeepManager)
            }
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM