0

我正在阅读FileDocument使用 SwiftUI。该文档可通过绑定到最顶层视图获得:

struct ContentView: View {
    @Binding var document: SomeDocument
    var body: some View {
        Text(self.document.someString)
        NestedChildViews().environmentObject(self.document)
    } 
}

有没有办法将@Binding文档的 this 转换为 an@EnvironmentObject以使其可用于所有嵌套视图?简单地替换@Bindingwith是@EnvironmentObject行不通的,因为FileDocument是一个结构。

Property type 'SomeDocument' does not match that of the 'wrappedValue' property of its wrapper type 'EnvironmentObject'

创建一个作为内部创建的中间ObservableObject是行不通的,因为它必须在 Binding to document 可用之前启动:@StateObjectContentView

struct ContentView: View {
    @Binding var document: SomeDocument
    @StateObject var sharedState = SomeSharedState(document: self.document) // won't work
}

在文档和一系列嵌套视图之间不传递所有级别之间的绑定的最佳方法是什么?

4

1 回答 1

1

您应该@StateObject从视图的 init 中初始化您的,因为您正在将 init 传递document给 init:

struct ContentView: View {
    
    @Binding var document: SomeDocument
    @StateObject var sharedState: SomeSharedState
    
    init(document: Binding<SomeDocument>) {
        _document = document
        _sharedState = StateObject(wrappedValue: SomeSharedState(document: document.projectedValue))
    }
    
    var body: some View {
        Text(document.someString)
            .environmentObject(sharedState)
            
            /* TEST TO SHOW IT WORKS
            .onAppear {
                DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                    document = SomeDocument(someString: "New!")
                }
            }
            */
    }
}

class SomeSharedState: ObservableObject {
    @Published var document: Binding<SomeDocument>
    
    init(document: Binding<SomeDocument>) {
        _document = Published(initialValue: document)
    }
}
于 2021-04-06T13:59:08.627 回答