Bonjour a tous,
voila mon problème.
j’a une variable « message » qui est renseigné via la valeur d’un UserDefault.
le UserDefault est modifié dans une fonction de la class HttpAuth.
Mon problème est que lors la variable UserDefault est modifiée, cela ne met pas à jour la variable message, et donc mon affichage n’est pas bon.
voici mon code:
import Foundation
import SwiftUI
import Combine
struct User: View {
@State var username: String = « »
@State var password: String = « »
let defaults = UserDefaults.standard
@State var message = UserDefaults.standard.integer(forKey: « erreur »)
var manager = HttpAuth()
@ViewBuilder
var body: some View {
VStack(alignment: .center) {
Text("message")
if message == 25 {
VStack(alignment: .center) {
Text("Bonjour \(username)")
{
Text("Se déconnecter")
.font(.headline)
.foregroundColor(.black)
.padding()
.frame(width: 220, height: 60)
.background(Color(red: 1.0, green: 0.75, blue: 0.0, opacity: 1.0))
.cornerRadius(15.0)
}
.padding()
}
}else {
VStack(alignment: .center) {
Text("Se connecter")
.font(.title)
TextField("Username", text: $username)
.padding()
.background(Color(red: 0.8863, green: 0.8863, blue: 0.8863, opacity: 1.0))
.cornerRadius(5)
.padding(.bottom, 20)
SecureField("Password", text: $password)
.padding()
.background(Color(red: 0.8863, green: 0.8863, blue: 0.8863, opacity: 1.0))
.cornerRadius(5)
.padding(.bottom, 20)
Button(action: {
if( self.username==("") || self.password==("") ){
self.showingAlert = true
}else{
self.manager.checkDetails(username: self.username, password: self.password)
self.message = UserDefaults.standard.integer(forKey: "erreur")
}
}) {
Text("LOGIN")
.font(.headline)
.foregroundColor(.black)
.padding()
.frame(width: 220, height: 60)
.background(Color(red: 1.0, green: 0.75, blue: 0.0, opacity: 1.0))
.cornerRadius(15.0)
}
.alert(isPresented: $showingAlert) {
Alert(title: Text("Erreur"), message: Text("Entrez vos identifiants"), dismissButton: .default(Text("OK")))
}
}
.padding()
}
}
}
struct ServerMessage: Decodable {
let erreur,username: String
}
class HttpAuth: ObservableObject {
let defaults = UserDefaults.standard
var didchange = PassthroughSubject<HttpAuth, Never>()
var authenticated = false{
didSet {
objectWillChange.send()
}
}
func checkDetails(username: String, password: String) {
let url = URL(string: "https://www.google.fr")!
let body: [String: String] = ["username": username, "password": password]
let finalBody = try! JSONSerialization.data(withJSONObject: body)
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = finalBody
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
fatalError("Error: \(error.localizedDescription)")
}
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
fatalError("Error: invalid HTTP response code")
}
guard let data = data else {
fatalError("Error: missing response data")
}
do {
let finalData = try? JSONDecoder().decode(ServerMessage.self, from: data)
if finalData?.erreur == "1" {
print(finalData!)
self.defaults.set(25, forKey: "erreur")
self.defaults.set("\(String(describing: finalData?.username))", forKey: "username")
}else{
print(finalData!)
self.defaults.set(0, forKey: "erreur")
}
}
}.resume()
}
}
}