【问题标题】:How can I access an EnvironmentObject from within a NSViewRepresentable / UIViewRepresentable 's Coordinator class?如何从 NSViewRepresentable / UIViewRepresentable 的 Coordinator 类中访问 EnvironmentObject?
【发布时间】:2021-04-12 00:32:00
【问题描述】:

我有一个名为 appState 的 EnvironmentObject,可以通过我的一些视图访问它以共享数据/状态。我在视图中使用它们的方式是这样的:

struct MetalView: NSViewRepresentable {
@EnvironmentObject var appState: AppState

如何从视图的 Coordinator 类访问 appState?

当我尝试以我尝试过的任何方式调用它时,我收到此错误:

“'MetalView' 类型的实例成员 'appState' 不能用于嵌套类型 'MetalView.Coordinator' 的实例”

有什么线索吗?

【问题讨论】:

    标签: swift swiftui appkit metalkit 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 程序员的小伙伴......

    如果高级程序员可以改进这一点,请这样做我可以学习。

    【讨论】:

      猜你喜欢
      • 2020-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多