簡體   English   中英

關閉工作表后SwiftUI重新加載視圖

[英]SwiftUI Reload View after dismissing a sheet

我在 UserDefaults 中有一個 bool 值來檢查用戶是否登錄。 在我的第一頁中,我有一個標題,當用戶單擊個人資料圖片時,它會顯示一個模式(使用 .sheet),在其中我有一個供用戶注銷的按鈕。

當用戶按下注銷按鈕並關閉模式時,如何更改視圖?

或者如何在用戶單擊“注銷”按鈕並關閉模式以檢查新的 Bool 值后重新加載主頁?

struct Home: View {

    var body: some View {
        ScrollView {
            VStack {   
                // MARK: Header
                Header(title: "Home")    
            }
            Spacer()
        }
        .padding(20)
    }
}

struct Header: View {

    public var title: String = ""
    @State private var showProfile = false

    var body: some View {
        HStack {
            // MARK: - User Profile
            Image("profile")
                .resizable()
                .clipShape(Circle())
                .frame(width: 50, height: 50)
                .onTapGesture {
                    print("⚠️ Profile has been tapped.")
                    self.showProfile.toggle()
            }
            .sheet(isPresented: $showProfile) {
                Account(showProfile: self.$showProfile)
            }

        }
    }
}

struct Account: View {

    @Binding var showProfile: Bool

    var body: some View {
        NavigationView {

            // MARK: - Account Sections
            List {

                // MARK: - Log Out -
                Section {
                    Button(action: {
                        print("❌ User has been logged out.")
                        self.showProfile.toggle()

                    }) {
                        Text("Log Out")
                            .bold()
                            .foregroundColor(.red)
                    }
                }
            }

                // MARK: - NavigationBar Settings
                .navigationBarTitle("Account", displayMode: .inline)
        }
    }
}

這是我的 UserDefault 類

class UsersSettings: ObservableObject {

    @Published var isLoggedIn: Bool = UserDefaults.standard.bool(forKey: "isLogged") {
        didSet {
            UserDefaults.standard.set(self.isLoggedIn, forKey: "isLogged")
            print(UserDefaults.standard.bool(forKey: "isLogged"))
        }
    }
}

很難說,你的目標是什么。 也許這會滿足您的要求 1) 當用戶點擊圖像時,工作表出現 2) 用戶可以登錄或退出,或者只需向下滑動手勢即可關閉工作表 3) 用戶圖像反映登錄/退出狀態

import SwiftUI

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

let loginModel = LoginModel()

struct ContentView: View {
    @ObservedObject var model = loginModel
    var body: some View {
        ScrollView {
            VStack {
                // MARK: Header
                Header(title: "Home", loggedIn: model.loggedIn)
            }
            Spacer()
        }
        .padding(20)
    }
}

struct Header: View {

    public var title: String = ""
    var loggedIn: Bool
    @State private var showProfile = false
    var body: some View {
        HStack {
            // MARK: - User Profile
            Image(systemName: loggedIn ? "photo.fill.on.rectangle.fill" : "photo.on.rectangle")
                .resizable()
                .clipShape(Circle())
                .frame(width: 50, height: 50)
                .onTapGesture {
                    self.showProfile.toggle()
            }
            .sheet(isPresented: $showProfile) {
                Account(showProfile: self.$showProfile)
            }

        }
    }
}

struct Account: View {

    @Binding var showProfile: Bool
    @ObservedObject var model = loginModel

    var body: some View {
        NavigationView {
            List {
                Section {
                    Button(action: {
                        self.model.loggedIn.toggle()
                        self.showProfile.toggle()

                    }) {
                        Text(model.loggedIn ? "Log Out": "Log In")
                            .bold()
                            .foregroundColor(.red)
                    }
                }
            }
            .navigationBarTitle("Account", displayMode: .inline)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

結果看起來像

在此處輸入圖片說明

UserSettings是事實來源,必須在您的工作表模式視圖 ( Account ) 中使用。

在 Home 或 Header 視圖中添加到此對象的綁定以觀察更改並相應地更新您的界面。

您可以像這樣聲明一個對象綁定:

struct Home: View {
  @ObservedObject var userSettings: UserSettings
  // ...
}

然后你觀察到這樣的變化:

struct Home: View {
  // ...  
  var body: some View {
    if userSettings.isLoggedIn {
      Text("User is logged in")
    } else {
      Text("User is not logged in")
    }
  } 
}

為此,您必須注銷您的 Active 視圖中的用戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM