[英]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 視圖中的用戶。
我設法從這個視頻中實現了我想要的:使用 Firebase 和 SwiftUI 的登錄頁面 - 使用 SwiftUI 將登錄頁面與 Firebase 集成
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.