Salut a tous !
Désolé si je n’écris pas dans une catégorie qui serait peut être plus appropriée mais c’est mon premier post sur ce forum… si un modérateur veux le bouger a la bonne place, ce n’est pas un problème.
Je suit entrain d’essayer de réécrire la structure de mon application en SwiftUI et j’ai du mal a comprendre l’utilisation de EnvironmentObject.
Mon app fonctionne de la façon suivante:
- L’utilisateur lance l’application pour la premiere fois, il arrive sur une page d’accueil qui lui présente l’application et lui demande de choisir entre:
– « Continuer »:
Un UID est stocké dans LocalStorage et la page « MainView »
– « Se connecter avec un compte existant »:
La page « LoginView » est presentee pour se connecter au compte et récupérer le backup.
- L’application a deja été lancée, la variable dans le LocalStorage est détectée et la page « MainView » est presentee directement.
import SwiftUI
import Combine
class ViewRouter: ObservableObject {
let objectWillChange = PassthroughSubject<ViewRouter,Never>()
var currentPage: String = "WelcomeView" {
didSet {
objectWillChange.send(self)
}
}
}
import SwiftUI
struct ParentView : View {
@EnvironmentObject var viewRouter: ViewRouter
var body: some View {
VStack {
if viewRouter.currentPage == "WelcomeView" {
WelcomeView()
}
else if viewRouter.currentPage == "MainView" {
MainView()
}
else if viewRouter.currentPage == "LoginView" {
LoginView()
}
}
}
}
import SwiftUI
struct WelcomeView: View {
@EnvironmentObject var viewRouter: ViewRouter
var body: some View {
ZStack{
// VStack { [plus de code ici] }
VStack {
LoginButtons().environmentObject(ViewRouter())
}
// VStack { [et plus de code là] }
}
}
}
import SwiftUI
struct LoginButtons: View {
@EnvironmentObject var viewRouter: ViewRouter
var body: some View {
VStack {
Button(action: {
self.viewRouter.currentPage = "MainView"
}) {
Text("NEW USER")
}
Button(action: {
self.viewRouter.currentPage = "LoginView"
}) {
Text("I ALREADY HAVE AN ACCOUNT")
}
}
}
}
import SwiftUI
struct MainView : View {
@EnvironmentObject var viewRouter: ViewRouter
var body: some View {
VStack {
// Juste pour savoir si ça fonctionne bien
Button(action: {
self.viewRouter.currentPage = "WelcomeView"
}) {
Text("MainView - GO BACK")
}
}
}
}
import SwiftUI
struct LoginView : View {
@EnvironmentObject var viewRouter: ViewRouter
var body: some View {
VStack {
// Juste pour savoir si ça fonctionne bien
Button(action: {
self.viewRouter.currentPage = "WelcomeView"
}) {
Text("LoginView - GO BACK")
}
}
}
}
J’ai passé plusieurs heures à comprendre ce qu’il n’allait pas dans mon code…
Je passais dans mon fichier « WelcomeView » mon « .environmentObject(ViewRouter()) » avant de passer la valeur à ma Sub-View « LoginButtons() »:
import SwiftUI
struct WelcomeView: View {
@EnvironmentObject var viewRouter: ViewRouter
var body: some View {
ZStack{
// VStack { [...] }
VStack {
LoginButtons()
// --> .environmentObject(ViewRouter())
}
// VStack { [...] }
}
}
}
Mais je ne comprends pas pourquoi ca ne fonctionne pas… est-ce que quelqu’un pourrait m’expliquer ?
Et également comment debugger (lire la variable contenue dans ViewRouter.currentPage)?
Cedric.