簡體   English   中英

如何刷新 SwiftUI 中的視圖

[英]How do I refresh View in SwiftUI

我有一個帶有登錄屏幕的應用程序。 它有 3 個標簽。 應用程序加載后,它會加載一個登錄選項卡。 但是,一旦憑據被命中並且 if 語句變為 true,它就不會顯示其他選項卡。 我想知道一旦條件變為真如何刷新視圖。

視圖控制台

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())
    }
}

應用代理

import SwiftUI

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

            ViewConsole()
                .environmentObject(admin)
        }
    }
}

您不會希望verify成為全局變量。 一種方法是將@State屬性添加到您的ViewConsole 要在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")
        }
    }
}

解決此問題的第二種方法是使用帶有@Published屬性的ObservableObject 看起來您已經將一個名為Admin設置為environmentObject 它可能看起來像這樣:

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