EnvironmentVariables не работает при передаче переменной из одного представления в другое в SwiftUI - PullRequest
1 голос
/ 03 февраля 2020

Я нашел несколько похожих примеров того, как передавать переменные между несколькими представлениями в SwiftUI:

  1. Взлом с помощью Swift - Как использовать @EnvironmentObject для обмена данными между представлениями
  2. Как передать переменную из одного представления в другое в 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) {
    }
}

1 Ответ

1 голос
/ 03 февраля 2020

Я не зависит от версии XCode, и это не проблема. Вы должны настроить ContentView в ContentView_Previews так же, как вы это сделали в SceneDelegate, предоставить .environmentObject, как в примере ниже

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().environmentObject(_Your_object_here())
    }
}
...