Если вы хотите использовать переменную окружения, вы должны объявить ее в SceneDelegate и установить ее в ContontentView:
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var loginViewModel = LoginViewModel()
func scene(_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
let contentView = ContentView()
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = HostingViewController(rootView: contentView.environmentObject(loginViewModel))
self.window = window
window.makeKeyAndVisible()
}
}
// etc.
Тогда в вашем ContenView вам не нужно устанавливать ее в любомпуть к LoginView в том виде, как он поддерживается средой:
struct ContentView: View {
@EnvironmentObject var loginViewModel: LoginViewModel
var body: some View {
return Group {
if loginViewModel.signInSuccess {
MainPageView()
} else {
LoginView()
}
}
}
}
В вашей модели убедитесь, что вы объявили свой signInSuccess как закрытый (установленный), чтобы его можно было установить только из класса и читать только изв другом месте:
final class LoginViewModel: ObservableObject {
@Published private(set) var signInSuccess:Bool = false;
func performLogin() {
signInSuccess = true;
}
}
И, наконец, в LoginView вам просто нужно включить @EnvironmentObject, и все остальное будет работать.
struct LoginView: View {
@EnvironmentObject var loginViewModel: LoginViewModel
var body: some View {
Button(action: { self.loginViewModel.performLogin() }) {
Text("Login")
.foregroundColor(Color.white)
}
}
}