SwiftUI EnvironmentObject 在视图初始值设定项中不可用?

2023-12-15

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

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 是否有特殊规则?

这是我的视图代码的开始。环境对象是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)
            }
        }

这是我在 AppDelegate.swift 中创建顶级内容视图的位置

        let contentView = ContentView(showCapture: true).environmentObject(appSettings)

And 只是要确定在顶级 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 在视图初始值设定项中不可用?

是的,SwiftUI EnvironmentObject 在视图初始值设定项中不可用。为什么?很简单——注入after对象初始化。

让我们考虑一下上面的例子是如何完成的ContentView:

let contentView = ContentView(showCapture: true).environmentObject(appSettings)

那么这是怎么回事?这里

  1. ContentView 类型的值的实例化和初始化
let newInstance = ContentView.init(showCapture: true) 
  1. 调用函数func environmentObject() on newInstance注入appSetting财产
let contentView = newInstance.environmentObject(appSettings)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI EnvironmentObject 在视图初始值设定项中不可用? 的相关文章

随机推荐

  • 关闭 Sql Server/T-SQL 中的日志记录

    我需要关闭 Sql Server T SQL 中的日志记录才能写入 as400 中的文件 表 我发现你可以在 SQLite 中使用 Pragma 来做到这一点 然而 我发现T SQL 中不存在这种情况 有任何想法吗 Thanks 您需要禁用
  • 如何在 ios 中将 y-planar、u-planar 和 uv-planar 与 yuv bi planar 分开?

    在应用程序中我使用了 AVCaptureVideo 我得到了 kCVPixelFormatType 420YpCbCr8BiPlanarFullRange 格式的视频 现在我从图像缓冲区获取 y 平面和 uv 平面 CVPlanarPixe
  • 将位图转换为 WebP 图像?

    谁知道是否可以转换Bitmap to a WebP图像使用C 一直在 Google 搜索 但找不到 C 的任何内容 我找到了这个 mc kay libwebp sharp GitHub但它似乎没有将位图转换为WebP format 有任何想
  • 创建可重用的 jQuery 函数

    我没有每次都重新编写大量代码 而是尝试将函数合并到我的工作中 但我在使其工作时遇到了困难 基本上 我有一些单选按钮的选择 每次单击单选按钮时我都会执行一些操作 我实际上正在加载 iFrame 但是 我需要使每个单选按钮的 iFrame SR
  • WSL 2 真的支持 32 位程序吗?

    我用谷歌搜索了这个问题 一些答案声明 WSL 2 现在支持 ELF 32 程序 然而 在wsl2 Debian Ubuntu发行版上的简单测试没有通过 这是我的测试 install run time sudo dpkg add archit
  • 将 GridView 绑定到 IQueryable

    这个问题纯粹是学术性的 因为我从来没有梦想过这样做real code 使用 LINQ to SQL 我想绑定一个IQueryable
  • 防止 Chrome 中链接点击时光标发生变化

    单击 Chrome 而非 Safari 或 Firefox 中的链接会将光标从指针更改为箭头 这种行为可以预防吗 即 单击后是否仍然有指针 但光标仍悬停在链接上 编辑 好的 我做了更多测试 首先 任何人希望光标在单击链接后保持为指针的唯一原
  • 覆盖默认主题的自定义主题 WP7

    是否可以创建自定义主题并将其用作默认主题 我可以在任何地方找到的每个示例都说您可以通过复制来创建自定义主题ThemeResources xaml and System Windows xaml文件并将它们作为合并字典包含在您的应用程序中 h
  • Webpack 使用 Typescript 进行延迟加载

    我遇到了延迟加载和 webpack 的问题 Sean Larkin 的视频展示了使用 webpack 4 创建延迟加载包是多么容易 Here 但是当我尝试用打字稿来做时 我遇到了一些问题 index ts export const some
  • 比较不同表的数据行

    我发布了一个类似查询前一段时间 决定降低它的复杂性 让开发人员回答我的主要问题 它可以说是重复的 但我仍然想将其发布 因为编辑上一篇文章并没有产生太多结果 我有 2 个数据表 dataTable1 和 dataTable2 两者都有 1 行
  • 在 URL 中传递 base64 编码的字符串

    通过 GET 参数传递原始 Base64 编码字符串是否安全 还有其他 base64 规范 见表here了解具体情况 但本质上你需要 65 个字符来编码 26 个小写 26 个大写 10 个数字 62 您还需要两个 和一个填充字符 但它们都
  • CRM 2011:全局 JavaScript 和状态栏中的按钮

    我对 CRM 2011 不太陌生 但我面临一个大问题 我在网上找到了一些解决方案 可以在 CRM 中创建一些评分 排名系统 当我在顶部状态栏中 功能区按钮栏上方 屏幕右上角用户名旁边看到星星时 我完全困惑了 当我单击此按钮时 我会打开 di
  • Excel C# 将单元格转换为百分比

    我需要将双精度的单元格转换为百分比 我在 Excel 中使用宏 它说 Range B5 Select Selection Style Percent 当我在 C 中执行此操作时 它不起作用 Excel Range procentRange
  • 数据库休眠并引发异常

    当我一段时间没有进行任何数据库查询时 我认为它必须休眠 如果你随后调用它 则会抛出异常 java sql SQLNonTransientConnectionException Could not read resultset unexpec
  • Objective-C 中的块真的有用吗?它们的效用是什么? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我刚刚读过有关块的内容 我了解到它们只是将信息封装为普通方法 但具有自己的强引用数据 我想知道块的好处是什么 这是适用于我的项目的块的用途 替换代表和协议 在某些情况下 问题 假设您需
  • 单元测试期间 Observable.fromPromise 为空

    loadAdList 是一个 Observable 它利用了actions stream loadAdList Observable
  • 斯威夫特词典

    我真的对我们在 swift 中创建字典的方式感到困惑 那么你能告诉我两者之间有什么不同吗 var myDic3 String AnyObject and var myDic2 Dictionary
  • 如何将容器文件挂载到我的 Docker 主机?

    我想将文件从 Docker 容器装载到我的 Docker 主机 数据卷对我来说不是解决方案 因为它们是从 docker 主机挂载到 docker 容器 而我需要相反的方式 Thanks 当 docker 挂载卷时 它会将容器内的目录与该卷的
  • 当我尝试打印向量元素时,我得到这些奇怪的字符! [复制]

    这个问题在这里已经有答案了 我正在使用 Netbeans 当我运行下面的程序时 我得到这个输出 I de6ced 怎么会 import java util Arrays import java util Vector public clas
  • SwiftUI EnvironmentObject 在视图初始值设定项中不可用?

    我成功地将environmentObject appSettings传递到我的视图中 我可以用它来修改我的字体和视图中的选择器 但是 如果我尝试在视图 init 中访问环境对象发布的变量 它会崩溃 Thread 1 Fatal error