SwiftUI Обновить вид после закрытия листа - PullRequest
2 голосов
/ 07 февраля 2020

У меня есть значение bool в UserDefaults, чтобы проверить, вошел ли пользователь в систему или нет. На моей первой странице у меня есть заголовок, где, когда пользователь щелкает по профилю pi c, он показывает модальный режим (с использованием .sheet), а внутри у меня есть кнопка для выхода пользователя из системы.

Как я могу изменить Посмотрите, когда пользователь нажимает кнопку LogOut и отклоняет модал?

Или как я могу перезагрузить главную страницу после того, как пользователь нажмет кнопку LogOut и отклонит модал, чтобы проверить новое значение 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"))
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 07 февраля 2020

UserSettings является источником истины и должен использоваться в модальном виде вашего листа (Account).

Добавьте привязку к этому объекту в представлении «Главная» или «Верхний колонтитул», чтобы наблюдать изменения и обновлять свой интерфейс соответственно.

Вы объявляете привязку объекта следующим образом:

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

Чтобы это работало, вы должны войти Пользователь I Ваш активный вид.

0 голосов
/ 17 февраля 2020
0 голосов
/ 07 февраля 2020

Трудно сказать, какова ваша цель. Может быть, это будет соответствовать вашим требованиям 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()
    }
}

результат выглядит как

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...