SwiftUI环境对象在视图初始值设定项中不可用?

SwiftUI环境对象在视图初始值设定项中不可用?,swiftui,Swiftui,我已成功将environmentObject appSettings传递到我的视图中。我可以使用它来修改我的字体和我视图中的选择器。但如果我试图访问view init()中的environmentObject已发布变量,它会崩溃: Thread 1: Fatal error: No ObservableObject of type AppSettings found. A View.environmentObject(_:) for AppSettings may be missing as a

我已成功将environmentObject appSettings传递到我的视图中。我可以使用它来修改我的字体和我视图中的选择器。但如果我试图访问view init()中的environmentObject已发布变量,它会崩溃:

Thread 1: Fatal error: No ObservableObject of type AppSettings found.
A View.environmentObject(_:) for AppSettings may be missing as an ancestor of this view.
在自定义SwiftUI视图初始值设定项中使用environmentObject是否有特殊规则

这是我的视图代码的开始。environmentObject是appSettings。如果我在我的初始值设定项中注释掉第2行并取消注释第3行,应用程序就会工作。请注意,我稍后在选择器中成功地使用了“appSettings.interfaces”

struct CaptureFilterView: View {

@State var etherCapture: EtherCapture? = nil
@EnvironmentObject var appSettings: AppSettings
@Binding var frames: [Frame]
@State var captureFilter: String = ""
@State var error: String = ""
@State var numberPackets = 10

@State var interface: String = ""
init(frames: Binding<[Frame]>) {
    self._frames = frames
    self.interface = appSettings.interfaces.first ?? "en0" //CRASH HERE
    //self.interface = "en0"  //uncomment this and comment line above to make app "work"
}
var body: some View {
    HStack() {
        ...
        Picker(selection: $interface, label: Text("")) {
            ForEach(appSettings.interfaces, id: \.self) { interfaceName in
                Text(interfaceName).tag(interfaceName)
            }
        }
只是为了确保在顶级ContentView中创建CaptureFilterView时也传递了environmentObject。这不是必需的,也不会改变行为

            if showCapture { CaptureFilterView(frames: self.$frames).environmentObject(appSettings) }
以下是我的应用程序设置的顶部,以供参考:

class AppSettings: ObservableObject {
    @Published var font: Font
    @Published var interfaces: [String]
SwiftUI环境对象在视图初始值设定项中不可用

是,SwiftUI环境对象在视图初始值设定项中不可用。为什么?它很简单-在对象初始化后注入

让我们考虑一下如何在上面的代码< Cordon VIEW/CON> >:< /P>

let contentView = ContentView(showCapture: true).environmentObject(appSettings)
这是怎么回事?这里

1) ContentView类型值的实例化和初始化

let newInstance = ContentView.init(showCapture: true) 
2) 在
newInstance
injected
appSetting
属性上调用函数
func environmentObject()

let contentView = newInstance.environmentObject(appSettings)
let contentView = newInstance.environmentObject(appSettings)