简体   繁体   English

如何刷新 SwiftUI 中的视图

[英]How do I refresh View in SwiftUI

I have an app with log in screen.我有一个带有登录屏幕的应用程序。 It has to 3 tabs.它有 3 个标签。 Once the app loads it loads a log in tab.应用程序加载后,它会加载一个登录选项卡。 But once the credentials are hit and the if statement turns to true it doesn't show the other tabs.但是,一旦凭据被命中并且 if 语句变为 true,它就不会显示其他选项卡。 I would like to know how to refresh the view once the conditional turns to true.我想知道一旦条件变为真如何刷新视图。

ViewConsole视图控制台

import SwiftUI

var verify = false

struct ViewConsole: View {
    var body: some View {
        if verify == true {
            TabView{
                ContentView()
                    .tabItem {
                        Label("Names", systemImage: "person.3")
                    }
                
                AdminView()
                    .tabItem{
                        Label("Admin", systemImage: "gear")
                    }
            }
        } else {
            LoginView()
                .tabItem{
                    Label("Log In", systemImage: "key")
                }
        }
    }
}

struct ViewConsole_Previews: PreviewProvider {
    static var previews: some View {
        ViewConsole()
            .environmentObject(Admin())
    }
}

App Delegate应用代理

import SwiftUI

@main
struct Work_Tracker_For_KumonApp: App {
    @StateObject var admin = Admin()
    
    var body: some Scene {
        WindowGroup {

            ViewConsole()
                .environmentObject(admin)
        }
    }
}

You aren't going to want verify to be a global variable.您不会希望verify成为全局变量。 One way to do it would be to add a @State property to your ViewConsole .一种方法是将@State属性添加到您的ViewConsole To have access to it in your LoginView , you can pass a Binding to it using the $ symbol.要在LoginView中访问它,您可以使用$符号将 Binding 传递给它。

struct ViewConsole: View {
    @State private var verify = false
    
    var body: some View {
        if verify {
            TabView {
                Text("Content")
                    .tabItem {
                        Label("Names", systemImage:
                                "person.3")
                    }
                Text("Admin")
                    .tabItem{
                        Label("Admin", systemImage:
                                "gear")
                    }
            }
        } else {
            LoginView(verify: $verify)
                .tabItem{
                    Label("Log In", systemImage:
                            "key")
                }
        }
        
    }
}

struct LoginView : View {
    @Binding var verify : Bool
    
    var body: some View {
        Button(action: {
            verify = true
        }) {
            Text("Verify")
        }
    }
}

A second way to approach this would be to use an ObservableObject with a @Published property.解决此问题的第二种方法是使用带有@Published属性的ObservableObject It looks like you already have one called Admin set up as a environmentObject .看起来您已经将一个名为Admin设置为environmentObject It might look something like this:它可能看起来像这样:

class Admin : ObservableObject {
    @Published var loggedIn = false
}

struct ViewConsole: View {
    @EnvironmentObject var admin : Admin
    
    var body: some View {
        if admin.loggedIn {
            TabView {
                Text("Content")
                    .tabItem {
                        Label("Names", systemImage:
                                "person.3")
                    }
                Text("Admin")
                    .tabItem{
                        Label("Admin", systemImage:
                                "gear")
                    }
            }
        } else {
            LoginView()
                .tabItem{
                    Label("Log In", systemImage:
                            "key")
                }
        }
        
    }
}

struct LoginView : View {
    @EnvironmentObject var admin : Admin

    var body: some View {
        Button(action: {
            admin.loggedIn = true
        }) {
            Text("Verify")
        }
    }
}

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

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