Как я могу получить доступ к EnvironmentObject из класса координатора NSViewRepresentable/UIViewRepresentable?

У меня есть EnvironmentObject с именем appState, доступ к которому осуществляется через некоторые из моих представлений для обмена данными/состояниями. Я использую их в представлении следующим образом:

      struct MetalView: NSViewRepresentable {
@EnvironmentObject var appState: AppState

Как я могу получить доступ к appState из класса координатора моего представления?

Когда я пытаюсь вызвать его любым способом, который я пробовал, я получаю эту ошибку:

«Член экземпляра appState типа MetalView нельзя использовать в экземпляре вложенного типа MetalView.Coordinator».

Любые подсказки?

1 ответ

Вот как я решил это:

AppState.swift:

      class AppState: ObservableObject {
    
    static let shared = AppState()
    init () {} // TODO: was private init, find out if this has benefits
    
    @Published var currentView: String = "login"
    // add rest of shared stuff below

AppDelegate.swift:

      func applicationDidFinishLaunching(_ aNotification: Notification) {
        let appState = AppState.shared

Доступ из представлений SwiftUI:

      struct ContentView: View {
    @EnvironmentObject var appState: AppState

Доступ из класса координатора NSViewRepresentable/UIViewRepresentable:

      class Coordinator: NSObject, MTKViewDelegate {
...  
        func draw(in view: MTKView) {
            ...
            context.render((AppState.shared.rawImage ?? AppState.shared.rawImageOriginal)!,
                to: drawable.texture,
                commandBuffer: commandBuffer,
                bounds: AppState.shared.rawImageOriginal!.extent,
                colorSpace: colorSpace)
    }
...

Мне потребовалось много времени, чтобы понять это, поэтому я надеюсь, что это поможет кому-то из начинающих программистов SwiftUI...

Если продвинутые программисты могут улучшить это, пожалуйста, сделайте так, чтобы я мог извлечь из этого уроки.

Другие вопросы по тегам