问题标签 [observedobject]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
895 浏览

swiftui - SwiftUI ObservableObject 和 @ObservedObject 不保持状态

我有这样的代码:

而且我考虑了为什么 ObservableObject 不保持它的状态(这个对象没有一个实例),而是在每个视图重绘时重新创建它(调用 init() 方法),而其他一些状态发生变化。我认为每个对象一次。

但是点击按钮会导致 View 被重新创建,并且这个 ObservedObject 也被重新创建。我是否应该不通过属性初始化而是在父级中创建它并将其传递给构造函数?

如何正确地将@ObservedObject 传递给子视图?我考虑将它传递给 @Bindable 属性,但它不起作用。

我正在通过Button model.isMenuOpen @Published 属性进行更改

0 投票
1 回答
581 浏览

swiftui - 模型中 UserDefaults 的 SwiftUI 问题

我正在学习 SwiftUI。我从做 Apple SwiftUI 教程开始。在其中一个中,他们提供了@EnviromentalObjects 来更改他们的模型,他们正在改变isFavorite bool 状态。但是他们没有将@ObservedObject 与 UserDefaults 一起使用,当我重新加载我的应用程序时,所有更改都令人失望。我已经学会了如何将UserDefaults用于视图中的值,现在如果我只想显示isFavorive对象或所有对象,并且当我重新加载我的应用程序时,这个切换按钮正在保存我的更改,我可以在我的对象列表中进行设置。

但我想对编辑我的模型做同样的事情。

有我的模型:

还有一个文件,我从 JSON 文件中加载数据(从苹果教程复制)

在这里你可以看到 CityData 是如何使用的:

%% 以及我如何更改“isFavorite”值

我试图在 UserDefault.standard.object 中嵌入 CityData,但它没有用。我肯定做错了什么。你能帮助我吗?

我的带有城市列表和 isFavorite Toggle 的应用

0 投票
1 回答
70 浏览

combine - ObservedObject 只传递其默认值;不是它的赋值。为什么?

场景:尝试通过ObservableObject广播变量值。
问题:我只得到默认值;不是指定的值。

这里是起源。
按钮 #1 启动一个函数来获取数据。
按钮 #2 检索 ObservedObject 的修改值

我删除了一些残留代码以使演示更简单:

所以我点击 Button #1 然后点击 Button #2 以检查ObservedObject是否具有生成的 id 值

我期待 print() 中有一个字母数字 id 值。

相反,我得到了原始值:

这是 ObservableObject:

顺便说一句:这是本地控制台输出,“id”的字符串值应该作为ObservedObject值传递给主机:

所以我确实有一个真正的 id 值要发送。

为什么只有原始值?
我错过了什么?

...我需要做一个'发送'还是什么?

0 投票
1 回答
104 浏览

swiftui - ObservedObject 没有接收到变量的变化

我有一个 Published 变量,该变量在调用函数时会发生变化。我在类中打印变量,我可以看到它已经设置了变量,但是当它没有改变我的视图时,当我打印变量时,它只打印我最初设置变量的内容。

我知道在这方面有几个类似的帖子,但是在浏览完它们之后,我仍然不确定我做错了什么。

代码如下:(减去我认为在这里不相关的位)

包含被调用以更改变量的函数的类

查看更新

调用函数的视图:

0 投票
1 回答
1014 浏览

swiftui - @State 和 @ObservedObject 有什么区别,它们都可以用来保持状态吗?

当我用 Google 搜索“State vs ObservedObject”时,第一个结果来自 Hacking with Swift,它说@ObservedObject

这与@State 非常相似,只是现在我们使用的是外部引用类型,而不是像字符串或整数这样的简单本地属性。

我可以@ObservedObject用来创建持久状态吗?它是否像@State简单属性和@ObservedObject复杂对象一样简单,还是有更多细微差别?

0 投票
2 回答
382 浏览

swift - SwiftUI 未通过手动发布进行更新

我有一堂课,一个定期更新的“钟面”;它应该显示一系列随时间变化的指标。

因为我希望时钟也显示在小部件中,所以我发现我必须将类放入框架中(也许还有另一种方法,但我现在走得太远了)。这似乎导致了 SwiftUI 和可观察对象的问题。

在我的View我有:

在钟面上我有:

我不知道是否Identifiable需要,但这对结果没有任何影响。这public是编译器要求的,但无论如何它总是这样。

使用这些行,我在应用程序启动时收到运行时错误:

objc[31175] 没有元类的类

所以我取下@Published并更改为手动更新:

现在我得到一个显示,通过设置一个断点,我可以看到send()它被定期调用。但是除非我从数组中添加/删除,否则显示不会更新。我在猜测计算变量(metricObjectSwiftUI 没有看到这些变化的大部分。我随后尝试向该类添加一个“虚拟”Int并将其myClock设置为随机值以尝试触发手动通过它刷新send()didSet没有运气。

那么如何强制定期重绘显示呢?

0 投票
1 回答
1066 浏览

swift - 如何创建符合 ObservableObject 的数组?

上面的代码错误信息:

在 'ObservedObject' 上引用初始化程序 'init(wrappedValue:)' 要求 '[Group]' 符合 'ObservableObject'

我需要符合数组,ObservableObject因为我需要检测 [Group] 中 Group 的 size 属性

如何制作数组ObservableObject(ObservedObject)

0 投票
2 回答
1415 浏览

swiftui - 如何在 SwiftUI 观察到的变量更改其值后立即触发操作

我的视图中有一个列表,一旦列表参数发生变化,它的元素就会被更新。这是我的观点:

}

视图中的用户列表

变量 users 是一个@ObservedObject,因此列表内容会在模型中发生更改时自动更新。

我的问题是:如何捕获有关users变量的“更新”事件?捕获后如何触发动作(例如调用函数)?

0 投票
1 回答
1019 浏览

swiftui-list - SwiftUI 列表在 @ObservedObject 更新时冻结

我有一个列表,它会在接近尾声时自动获取更多数据:

模型看起来像:

我的问题:每个@Published/@ObservedObject 修改我在滚动列表时都有一点冻结。另外,我发现 List 会重新计算所有可见视图的主体 + 上方和下方的一些视图。

但我无法确定是什么导致滚动挂起并修复它(也许冻结是转移到等于(滚动速度 * 渲染时间)的距离?

为什么 SwiftUI 会在现有视图上重新计算主体?他们没有改变!

你能帮助我吗?

0 投票
1 回答
3876 浏览

ios - SwiftUI 自定义 View 的 ViewBuilder 不会在子类 ObservedObject 更新时重新渲染/更新

我已经研究了几天,搜索了 Swift 和 SwiftUI 文档、SO、论坛等,但似乎找不到答案。

这是问题所在;

我有一个 SwiftUI 自定义视图,它对远程资源的自定义 API 请求类进行一些状态确定。View 处理显示加载状态和失败状态,以及通过 ViewBuilder 传递的主体内容,因此如果来自 API 的状态成功并且资源数据已加载,它将显示页面的内容。

问题是,当子类 ObservedObject 更新时,ViewBuilder 内容不会重新呈现。对象会根据 UI 进行更新(按下按钮时等),但 UI 从不重新渲染/更新以反映子类 ObservedObject 中的更改,例如,子类 ObservedObject 中数组后面的 ForEach 不会刷新数组内容改变。如果我将其移出自定义视图,则 ForEach 将按预期工作。

我可以确认代码编译并运行。观察者和debugPrint()'s 自始至终表明,ApiObject正在正确更新状态,并且 View 反映了ApiState变化。它只是ContentViewBuilder 的。我假设是因为 ViewBuilder 只会被调用一次。

编辑:上面的段落应该是提示,ApiState更新正确,但是在将大量日志记录到应用程序之后,UI 没有监听子类 ObservedObject 的发布。属性在变化,状态也在变化,但 UI 并没有对此做出反应。另外,下一句结果是假的,我在 VStack 中再次测试,组件仍然没有重新渲染,这意味着我找错地方了!

如果是这种情况,VStack其他此类元素如何解决这个问题?或者是因为我ApiObjectView的状态变化被重新渲染,导致子视图“重置”?尽管在这种情况下,我希望它能够接收新数据并按预期工作,但它永远不会重新渲染。

有问题的代码在CustomDataList.swift下面ApiObjectView.swift。我留下评论指出正确的方向。

这是示例代码;

ForEach这是在ObservedObject更改其绑定数组属性时重新呈现其问题的视图。

这是有问题的自定义视图,不会重新呈现其内容。

现在,如果ApiObjectView不使用 并且将内容直接放在 View 中,上述所有代码都可以正常工作。

但是,这对于代码重用和架构来说是可怕的,这样它既漂亮又整洁,但不起作用。

有没有其他方法可以解决这个问题,例如通过 aViewModifierView扩展?

对此的任何帮助将不胜感激。

正如我所说,我似乎找不到任何有此问题的人或任何在线资源可以为我指出解决此问题的正确方向,或者可能导致它的原因,例如 ViewBuilder 文档中概述的。

编辑:为了加入一些有趣的东西,我已经添加了一个倒数计时器CustomDataList,它每 1 秒更新一个标签。如果该计时器对象更新了文本,则重新呈现视图,但当显示倒计时时间的标签上的文本更新时。