gpt4 book ai didi

SwiftUI EnvironmentObject 在 View 初始化程序中不可用?

转载 作者:行者123 更新时间:2023-12-04 02:38:33 65 4
gpt4 key购买 nike

我成功地将 environmentObject appSettings 传递到我的 View 中。我可以使用它来修改我的字体和 View 中的选择器。但是,如果我尝试在 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 View 初始化程序中使用 environmentObject 是否有特殊规则?

这是我的 View 代码的开始。 environmentObject 是 appSettings。如果我在初始化程序中注释掉第 2 行并取消注释第 3 行,则应用程序可以工作。请注意,我稍后在我的 Picker 中成功使用了“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)
}
}

这是我在 AppDelegate.swift 中创建顶级内容 View 的地方
        let contentView = ContentView(showCapture: true).environmentObject(appSettings)

只是为了确定在顶级 ContentView 中创建 CaptureFilterView 时,我也会传递 environmentObject。这不是必需的,也不会改变行为。
            if showCapture { CaptureFilterView(frames: self.$frames).environmentObject(appSettings) }

这里是我的appSettings的顶部供引用:
class AppSettings: ObservableObject {
@Published var font: Font
@Published var interfaces: [String]

最佳答案

SwiftUI EnvironmentObject not available in View initializer?


是的,SwiftUI EnvironmentObject 在 View 初始化程序中不可用。 为什么?很简单——注入(inject) 之后 对象初始化。
让我们考虑一下上面的示例是如何完成的 ContentView :
let contentView = ContentView(showCapture: true).environmentObject(appSettings)
那么这里发生了什么?这里
  • ContentView
  • 类型的值的实例化和初始化
    let newInstance = ContentView.init(showCapture: true) 
  • 调用函数 func environmentObject()newInstance注入(inject)appSetting房产
  • let contentView = newInstance.environmentObject(appSettings)
    backup

    关于SwiftUI EnvironmentObject 在 View 初始化程序中不可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60514448/

    65 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com