Я пытаюсь переписать свое приложение, используя только SwiftUI, и у меня возникают трудности с EnvironmentObject, я пытаюсь понять, как он работает…
Я хочу перенаправить пользователей моего приложения на соответствующую страницу при запуске, в зависимости от на:
- , если это их первый раз
- , если у них есть логин,
- , если они хотят начать использовать без входа
Если приложение запускается впервые, у LocalStorage нет данных, поэтому я представляю приложение на странице приветствия. Я предлагаю на выбор 2 кнопки для нажатия:
- «Новый пользователь» которые перенаправляют на главную страницу приложения и создают нового пользователя
- «Вход», который представляет страницу входа для получения последней резервной копии. Если приложение было ранее запущено, я сразу же представляю главную страницу.
Теперь сказано, что если я инициирую свой «currentPage» как «MainView» или «LoginView», он работает, но НЕ, если он установлен как «WelcomeView». Я предполагаю, что проблема возникает, когда переменная изменяется из подпредставления? Я думал, что использование @EnvironmentObject - способ обойти это ...
Может кто-нибудь объяснить мне, как это работает?
Мои различные файлы:
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 { [some irrelevant extra code here] }
VStack {
LoginButtons().environmentObject(ViewRouter())
}
// VStack { [some irrelevant extra code here] }
}
}
}
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 {
// Just want to check if it is working for now before implementing the appropriate Views...
Button(action: {
self.viewRouter.currentPage = "WelcomeView"
}) {
Text("BACK")
}
}
}
}
import SwiftUI
struct LoginView : View {
@EnvironmentObject var viewRouter: ViewRouter
var body: some View {
VStack {
// Just want to check if it is working for now before implementing the appropriate Views...
Button(action: {
self.viewRouter.currentPage = "WelcomeView"
}) {
Text("BACK")
}
}
}
}
Заранее большое спасибо! : wink: