首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SwiftUI @EnvironmentObejct似乎无法更新值

SwiftUI @EnvironmentObject 是一个用于在 SwiftUI 视图之间共享数据的机制。它允许我们在应用程序中创建一个可观察对象(Observable Object),并将其注入到视图层次结构中的任何视图中,以便这些视图可以访问和更新共享的数据。

然而,有时候我们可能会遇到一个问题,即 @EnvironmentObject 似乎无法更新值。这可能是由于以下几个原因导致的:

  1. 对象未正确注入:确保你已经正确地将可观察对象注入到视图层次结构中。你可以使用 @EnvironmentObject 属性包装器将对象注入到视图中,或者使用 .environmentObject() 修饰符将对象传递给视图。
  2. 对象未正确更新:当你想要更新 @EnvironmentObject 中的值时,你需要确保对象的属性是可变的,并且你使用的是正确的更新方法。例如,如果你的可观察对象是一个类,你需要使用 @Published 属性包装器来标记要更新的属性,并使用对象的方法来更新该属性的值。
  3. 视图未正确刷新:有时候,当 @EnvironmentObject 中的值发生变化时,视图可能不会自动刷新。这可能是因为你没有正确地使用 @ObservedObject@StateObject 属性包装器来标记依赖于 @EnvironmentObject 的视图。确保你正确地标记了依赖项,并在视图中使用它们。

如果你遇到了 @EnvironmentObject 无法更新值的问题,可以尝试以下解决方法:

  1. 确保正确注入对象:检查你是否正确地将可观察对象注入到视图中,并确保在视图层次结构中的每个视图中都使用了 @EnvironmentObject 属性包装器或 .environmentObject() 修饰符。
  2. 确保正确更新对象:如果你的可观察对象是一个类,请确保你使用了 @Published 属性包装器来标记要更新的属性,并使用对象的方法来更新该属性的值。
  3. 确保视图正确刷新:使用 @ObservedObject@StateObject 属性包装器来标记依赖于 @EnvironmentObject 的视图,并确保在视图中使用它们。

如果以上方法仍然无法解决问题,可能需要进一步检查代码逻辑或查阅相关文档和资源来解决特定的问题。

腾讯云提供了一系列与云计算相关的产品和服务,例如云服务器、云数据库、云存储等。你可以在腾讯云官方网站上找到更多关于这些产品的详细信息和文档。

参考链接:

  • SwiftUI: https://developer.apple.com/xcode/swiftui/
  • @EnvironmentObject: https://developer.apple.com/documentation/swiftui/environmentobject
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Ask Apple 2022 与 SwiftUI 有关的问答(下)

本文对本次活动中与 SwiftUI 有关的一些问答进行了整理,并添加了一点个人见解。本文为下篇。访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验以及最新的更新内容。...似乎唯一的方法是在数组中搜索匹配的 id ,这对于大表来说似乎效率很低。A:用数组索引来存储选择是很脆弱的:如果数组发生了突变,选择就会变得不同步。...开发者即使无法实现这样的布局容器,也应对各种尺寸需求的定义有清晰的理解。在 SwiftUI 布局 —— 尺寸( 上 )[8] 一文中,对建议尺寸的几种模式都进行了介绍。...当视图的结构过于复杂时,除了难以阅读外,还会出现无法使用代码自动补全以及上文提到的无法编译( too complex to type check )的情况。...onPreferenceChange(:_,perform:_) 来获取收集的坐标信息但是这样的实现方式,无法获取到 velocityA:请问你需要这个速度做什么用途?

14.8K30

SwiftUI 与 Core Data —— 数据获取

SwiftUI 与 Core Data —— 问题[2]SwiftUI 与 Core Data —— 数据定义[3]访问我的博客 www.fatbobman.com[4] 可以获得更好的阅读体验以及最新的更新内容...我也做了不少的尝试,但最终发现似乎 FetchRequest 仍是当前 SwiftUI 中的最优解。...方法的具体细节,开发者无法自行向 SwiftUI 申请数据保存地址,但可以通过在自定义的类型中( 符合 DynamicProperty 协议 )使用系统提供的符合 DynamicProperty 协议的类型...不可在 update 方法中同步地改变引发视图更新的数据与 SwiftUI 在视图中更新 Source of truth 的逻辑一致,在一个视图更新周期中,不能对 Source of truth 再度更新...ID 顺序或数量没有发生变化时,即使数据的属性发生变化,MockableFetchRequest 也不会更新数据集。

4.6K30
  • Ask Apple 2022 与 SwiftUI 有关的问答(上)

    本文对本次活动中与 SwiftUI 有关的一些问答进行了整理,并添加了一点个人见解。本文为上篇。访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验以及最新的更新内容。...SwiftUI 4.0 中,WindowGroup 获得了相当大的更新,真正具备了开发 macOS 应用的能力。...( 例如,账户余额为 10 美元 ),但一些开发人员没有意识到这个说明在 VoiceOver 中无法被读取。...我知道 @State 应该是一个内部,但在某些情况下,我们需要从外部传入一个,这对于 onAppear 似乎并不可行。下面的方法由于某种原因并不总是有效。...详细请阅读 避免 SwiftUI 视图的重复计算[22] 。从父视图通过环境进行传递应该可以满足提问者当前的需求:父视图可以传入新,当前视图也可以在视图范围内改变该

    12.2K20

    避免 SwiftUI 视图的重复计算

    每个视图都有与其对应的状态,当状态变化时,SwiftUI 都将重新计算与其对应视图的 body 。...并且 SwiftUI 会在其变化时自动更新( 重新计算 )对应的视图。 SwiftUI 上有一个困扰了不少人的问题:为什么无法在视图的构造函数中,更改 State 包装的变量值?...创建新实例 将新实例与 SwiftUI 当前使用的实例进行比对 如实例发生变化,用新实例替换当前实例,对实例的 body 求值,并用新的视图替换老的视图 视图的存续期不会因为实体的更替有所改变 由于...比对结果仅能证明两个实例之间是否不同,但 SwiftUI 无法确定这种不同是否会导致 body 的发生变化,因此,它会无脑地对 body 进行求值。...让视图符合 Equatable 协议以自定义比对规则 也许由于某种原因,你无法采用上面的方法来优化构造参数,SwiftUI 还提供了另外一种通过调整比对规则的方式用以实现相同的结果。

    9.3K81

    SwiftUI geometryGroup() 指南:从原理到实践

    在 WWDC 2023 中,苹果为 SwiftUI 添加了一个新的修饰器:geometryGroup()。它可以解决一些之前无法处理或处理起来比较困难的动画异常。...访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验以及最新的更新内容。...几何组充当父视图与其子视图之间的屏障,迫使位置和大小的由父视图解析和动画化,然后再传递给每个子视图。...在创建黄色圆形时,它无法获得状态改变前的 topLeading 位置信息,因此无法满足我们的要求。 本节涉及到 transaction 以及 SwiftUI 动画的一些内部运行机制。...它为子视图提供了一个连续的几何信息更新过程。 总结上述条件后,我们就很容易创建出其它会导致意外行为的代码。

    28110

    GeometryReader :好东西还是坏东西?

    特别是在最近几次 SwiftUI 更新中新增了一些可以替代 GeometryReader 的 API 后,这种观点进一步加强。...GeometryReader 无法获取正确的几何信息:这种观点认为,在某些情况下,GeometryReader 无法获取精确的几何信息,或者在视图未发生变化(视觉上)的情况下,其获取的信息可能不稳定。...这些批评并非全无道理,其中相当一部分已经通过新的 API 在 SwiftUI 版本更新后得到了改善或解决。...将几何信息传递到上层视图,可能会引起不必要的视图更新。而向下传递信息,可以确保更新只在 GeometryReader 的闭包中进行。 GeometryReader 是布局容器吗,它的布局逻辑是什么?...因此,在这种情况下,通常我们只会使用拥有明确维度的尺寸( 建议尺寸有 ),并以此为来计算另一维度的尺寸。

    59970

    肘子的 Swift 周报 #036 | WWDC 2024 观后感

    虽然表面上新增的功能似乎并不多,但底层的大幅调整却是颠覆性的。考虑到 SwiftData 仅成立一年,这样的变化尤为出人意料。从首个测试版本的表现来看,稳定性目前仍是主要挑战。...SwiftUI 初次接触 SwiftUI 今年的新特性时,我并未感到特别兴奋。然而,做了更多的研究后,我意识到此次更新SwiftUI 的发展史上将具有十分重要的意义。...从这个版本开始,SwiftUI 开发团队似乎找到了快速发展 SwiftUI 的正确路径,探索出了在保持声明式框架特性的同时,有效提升其表现力的方法。...在这次更新中,SwiftUI 团队转变了其以往的 API 设计策略——过往的设计高度封装且调整空间较小,现在则为开发者提供了更多的底层控制能力。...https://twitter.com/pasqualevitt [49] WWDC 2024 Sample Code: https://t.ly/WqfE6 [50] 探索 WWDC24 上公布的重大更新

    12310

    从前端视角看 SwiftUI

    虽然不知道 SwiftUI 背后的实作,但背后应该也有类似 diff 机制的东西来达到响应式机制与最小更新的效果。 然而 SwiftUI 的状态管理与 React hooks 仍有差异。...} } } 在这个例子当中把 toggle 的逻辑拆成一个 class 似乎有点小题大作了,不过仔细想想像 React 提供的 hook 功能,让轻量的逻辑共用就算单独拆成 hook 也不会觉得过于冗长...而最近的趋势似乎从 Redux 演变成了 TCA(The Composable Architecture),跟 Redux 的中心思想类似,更容易与 SwiftUI 整合,比较不一样的地方在于以往涉及...既然采用了类似 redux 的手法,不知道 SwiftUI 是否会遇到与前端开发类似的问题,例如 immutability 确保更新可以被感知;透过优化 subscribe 机制确保 store 更新时只有对应的元件会更新...我还蛮想了解 SwiftUI 背后是怎么计算 diff 的,希望之后有类似的文章出现 @State 修饰符可用来定义元件内部状态,当状态改变时会更新并反映到画面中。

    3.5K20

    SwiftUI 布局协议 - Part2

    简单的说,通过添加 animatableData 属性到我们的布局,我们要求 SwiftUI 动画的每一帧重新计算布局。但是,在每个布局传递中,角度都会收到一个内插。...= nil } 注意:我称它为双向自定义,因为信息是可以双向流动的,但是,这不是 SwiftUI 的官方术语,只是为了更清晰的解释这个想法的术语。...这与双向自定义无关。这是你在写任何布局都必须要考虑的。我们提到 SwiftUI 可能会多次调用 sizeThatFits 去测试视图的灵活性。在这些调用中,你返回的应该是合理的。...这意味着我们无法调用它们。...此外,在与其他视图布局工作的时候,我们就相当于 SwiftUI 的角色。子布局的任何缓存创建和更新都属于我们的责任,幸运的是,这都很容易处理。我们只需要添加子布局缓存到我们自己的缓存里。

    2.7K30

    苹果在 iOS 15 中使用了 Swift 和 SwiftUI

    这里使用的方法无法真正检测到使用 Objective-C++ 构建的二进制文件。此类二进制文件被视为同时使用 Objective-C 和 C++ 。 最后,你应该对这个分析持保留态度。...虽然我相信总体情况是准确的,但我的方法有一些局限性,因为我无法访问 iOS 源代码,并且依赖于不精确的编译工件。...今年也是采用 SwiftUI 的重要一年。一些广泛使用的应用程序现在似乎在 iOS 15 中使用 SwiftUI: 图书 地图 备忘录 天气 提示 音乐 播客 FaceTime ?...SwiftUI 去年几乎不引人注目,但今年苹果似乎更广泛地采用了它,即使在旗舰应用程序中也是如此。 C++ 和 C 仍然发挥着重要作用。...iOS3.txt iPhone OS 2.0 (5A347) iPhone 2G iOS2.txt iPhone OS 1.0 (1A543a) iPhone 2G iOS1.txt 结论 即使我们无法访问

    2.2K30

    SwiftUI 中用 Text 实现图文混排

    访问我的博客 www.fatbobman.com[1] 可以获得更好的阅读体验以及最新的更新内容。...王巍在 SwiftUI 中的 Text 插和本地化[3] 一文中对此做了详尽的介绍。...Text("Hello \(bug)") // 在插中使用 Image 类型,由于 font 会改变 Image 的类型,因此无法单独修改 bug 的大小Text("Hello \(bugText)"...例如 frame、scaleEffect、scaleToFit、alignmentGuide 之类会改变类型状态的修饰器将导致无法进行 Text 插以及加法运算操作!...偏移应该根据不同的动态类型进行微调( 本人偷懒,范例代码中使用了固定 )方案一的优缺点方案简单,实现容易由于图片需要预制,因此不适合标签种类多,且经常变动的场景在无法使用矢量图片的情况下,为了保证缩放后的效果

    4.4K30

    SwiftUI @State @Published @ObservedObject 深入理解和使用

    1.SwiftUI 是Apple 新出面向未来、跨多端解决方案、声明式编程 SwiftUI最新版本 2.0 但是需要 IOS 14 支持,多数现在还用的是IOS 13 所以很多不完善的东西都用SwiftUIX...@State允许我们绕过结构体的限制:我们知道不能更改它们的属性,因为结构是固定的,但是@State允许SwiftUI将该单独存储在可以修改的地方。...比如我们定义的数据结构Model,前提是 @Published 要在 ObservableObject 下使用 然后用 @ObservedObject 来引用这个对象,当然@State 不会报错,但是无法更新...因为SwiftUI更新数据的前提是触发 第一层 绑定的对象 wrapperModel下的属性(字段)发生更新才会调用视图层更新数据 但是 第一次下绑定的对象还绑定了 @ObservedObject 或者其他类型的对象呢...{ /// /// 注意 /// 接收 子类model 时候要用 @ObservedObject 不能用 @Published /// 因为SwiftUI 更新机制是当前对象有

    3.2K10

    AnyView 对 SwiftUI 性能的影响

    当使用 FPS 作为度量标准时,重要的是指定最大帧速率(在这种情况下为 60),并在应用程序没有活动时丢弃。浏览数据首先,让我们看看在浏览内容时不同的实现会表现如何。...这也是预期的,因为 SwiftUI 知道视图的标识和结构。当需要更新视图时,仅对其进行更改(例如,向视图添加另一个反应)。...通过使用 AnyView,效果类似于将 id 修饰符的设置为 UUID() - 这将在发生更改时始终更新视图项目。...如果使用条件检查或 AnyView,将无法确定行数,并且必须提前创建所有视图,这会影响性能。...这也取决于实现的方式 - 你的数据模型,将状态传递到哪里,哪些更新可能会导致视图重绘等等。

    12400

    SwiftU:将状态绑定到UI控件

    SwiftUI的@State属性包装器允许我们自由修改视图结构体,这意味着当程序更改时,我们可以更新视图属性以匹配。 但是,使用UI控件时,事情会更复杂一些。...但是,该代码不会编译,因为SwiftUI想知道文本字段中的文本存储位置。 请记住,视图是其状态的函数——文本输入框只能在反映存储在程序中的时显示某些内容。...SwiftUI需要的是结构中的一个字符串属性,它可以显示在文本输入框中,还将存储用户在文本输入框中键入的任何内容。...但是,该代码仍然无法工作,因为Swift需要能够更新name属性以匹配用户在文本字段中键入的任何内容,因此您可以使用`@State``,如下所示: @State private var name = "..." 但这还不够,我们的代码仍然无法编译。

    2.9K10

    探讨 SwiftUI 中的几个关键属性包装器

    它主要用于存储类型数据(与视图的生命周期一致)。 典型应用场景 当需要因视图内的数据变化而触发视图更新时,@State 是理想的选择。 它常用于简单的 UI 组件状态管理,如开关状态、文本输入等。...详见 避免 SwiftUI 视图的重复计算[7]。 如果不需要在当前视图或在子视图中(通过 @Binding )修改,无需使用 @State。...只有能够引发视图更新被 get 方法读取时,才会触发视图更新( 比如 @State、@StateObject ),这点对于自定义 Binding 尤为重要。...注意事项 在 iOS 13 中,由于没有提供 @StateObject ,此时 @ObservedObject 是唯一选择,可能会因为无法保证实例的存续期而产生 意想不到的结果[12],为了避免类似问题...开发者可以通过自定义 EnvironmentKey 的方式来创建自定义环境,与系统提供的环境一样,可以定义各种类型( 类型、Binding、引用类型、方法的 ),详情请参阅 Custom SwiftUI

    29910

    ViewBuilder 研究(下) —— 从模仿中学习

    视图的依赖包括:视图的基本属性(无需符合 DynamicProperty 协议)、可驱动视图更新的属性 ( 符合 DynamicProperty 协议,例如 @State、@Environment 等)...(结构,非 body )将被保存在 SwiftUI 的托管数据池中 根据视图的依赖信息在 AttributeGraph 数据池中创建与当前显示的视图树对应的依赖图,并监控依赖的变化 依据 SwiftUI...,按视图层级结构依当前状态逐个实例化视图类型(到满足全部显示所需为止) 将已不再需要参与布局和渲染的视图的SwiftUI 数据池中移除,并在数据池中添加上新增的视图 对于仍需显示但视图发生变化的视图...目前无法自行实现这几个非公开的方法,仅能使用 SwiftUI 提供的默认实现。但 SwiftUI 框架提供的基本视图类型则充分利用了这些接口以实现各自的不同需求。...也无法避免。

    3K20
    领券