Я нашел несколько похожих примеров того, как передавать переменные между несколькими представлениями в SwiftUI:
- Взлом с помощью Swift - Как использовать @EnvironmentObject для обмена данными между представлениями
- Как передать переменную из одного представления в другое в SwiftUI
Я пытаюсь следовать примерам и использовать EnvironmentVariables и изменять ContentView там, где он был впервые определен в SceneDelegate. Однако при попытке использовать оба примера я получаю сообщение об ошибке «Ошибка компиляции: ContentView_Previews не является типом элемента« Environment »». Я использую Xcode версии 11.3.1.
Следуя примеру, приведенному в Как передать переменную из одного представления в другое в SwiftUI , здесь приведен код, содержащийся в ContentView:
class SourceOfTruth: ObservableObject{
@Published var count = 0
}
struct ContentView: View {
@EnvironmentObject var truth: SourceOfTruth
var body: some View {
VStack {
FirstView()
SecondView()
}
}
}
struct FirstView: View {
@EnvironmentObject var truth: SourceOfTruth
var body: some View {
VStack{
Text("\(self.truth.count)")
Button(action:
{self.truth.count = self.truth.count-10})
{
Text("-")
}
}
}
}
struct SecondView: View {
@EnvironmentObject var truth: SourceOfTruth
var body: some View {
Button(action: {self.truth.count = 0}) {
Text("Reset")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView().environmentObject(SourceOfTruth())
}
}
... и здесь это содержимое SceneDelegate:
import UIKit
import SwiftUI
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var truth = SourceOfTruth() // <- Added
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 = UIHostingController(rootView: ContentView().environmentObject(SourceOfTruth())) // <- Modified
self.window = window
window.makeKeyAndVisible()
}
}
func sceneDidDisconnect(_ scene: UIScene) {
}
func sceneDidBecomeActive(_ scene: UIScene) {
}
func sceneWillResignActive(_ scene: UIScene) {
}
func sceneWillEnterForeground(_ scene: UIScene) {
}
func sceneDidEnterBackground(_ scene: UIScene) {
}
}