问题标签 [observableobject]

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 回答
412 浏览

swiftui - SwiftUI ObservableObject 用作​​ EnvironmentObject 奇怪的行为

我有这样ObservableObject的情况,我通过使用environmentObject().

以下是我不太了解的问题: 1. 上面的代码可以正常工作,因为所有属性都是@Published。2. 但是如果我把它改成这样

然后@Published 属性停止刷新依赖于这个 ObservableObject 的视图!这是为什么。我也尝试添加didSetobjectWillChange.send()但这也会导致一些奇怪的行为,并且代码有点尴尬。

这是否意味着我只能使用@PublishedONLY objectWillChange方法?

0 投票
1 回答
70 浏览

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

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

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

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

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

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

相反,我得到了原始值:

这是 ObservableObject:

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

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

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

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

0 投票
1 回答
1191 浏览

xcode - SwiftUI Observable 使用变量时未更新

出于某种原因,当将 Observable 的对象分配给变量然后更改它时 - 视图不会更新。但如果我直接通过它的索引访问它 - 它会:

不会工作:

是否有效:

我的猜测是关于参考,但我不确定:(

示例代码:

0 投票
1 回答
549 浏览

filter - 使用 SearchBar 过滤内容时,UI 冻结并且填充结果很慢

我终于有了工作代码来搜索对象数组,但是在视图中填充/显示列表结果真的很慢。我一直在研究使用 ObservableObject 和 EnvironmentObject 但我不确定如何在这里实现它们。我正在导入 CSV 并将标题用作键并将行项用作值,然后将它们显示在列表中。当我尝试搜索某些内容时,列表会重新填充,但需要很长时间。任何帮助将不胜感激!!!

ListView.swift

搜索栏.swift

0 投票
4 回答
2320 浏览

ios - 当我使用属性更新视图时,ObservedObject 会重置。因此会导致数据丢失

我有一个问题,ViewModel当视图更新时会重新初始化。

我有 2 个视图,SongListView它们PlayerView共享一个Player. 当玩家的 Playing 状态改变(isPlaying == true)时,viewModelinSongListView重置并变成空数组。因此,我视图上的列表变为空。

在此处输入图像描述

歌曲列表视图:

歌曲列表视图模型:

播放器视图:

玩家:

提前致谢!

更新:仍然不起作用

0 投票
2 回答
3444 浏览

navigationview - SwiftUI - 多次创建 ObservableObject

我在视图中创建了一个 ObservableObject。

FilterSelectionModel我在's函数中放置了一个断点init,它被多次调用。因为这个 View 是 a 的一部分NavigationLink,所以我知道它是在随后创建的,并且与它一起创建了 selectionModel。当我导航到视图时,将再次创建 selectionModel。

在同一个视图中,我有一个“子视图”,我将 selectionModel 作为一个传递,EnvironmentObject以便子视图可以更改它。

当子视图被关闭时,selectionModel 再次被创建,对它所做的更改也消失了。

有趣的注意事项:在最顶层是一个NavigationView. 如果我添加

对此NavigationView,我的 selectionModel 的更改消失了。但是,如果我添加navigationStyle,则在子视图中所做的 selectionModel 更改仍然存在!(但我不想要拆分导航视图,我想要堆叠导航视图)

在这两种情况下 - 无论有没有navigationStyle, selectionModel 都会被创建多次。我无法理解这些应该如何可靠地工作。

0 投票
0 回答
406 浏览

ios - 如何将 SwiftUI TextField 中用户输入的字符串传递给 ViewController 视图?

我有一个 SwiftUI 应用程序。为此,它是 3 个视图:

  1. NewPost(包含 TextField 的 SwiftUI 视图)
  2. RecordVideoViewWrapper(引用RecordView,引用Storyboard中的RecordVideoViewController)
  3. VideoPlaybackViewController(从 RecordVideoViewController 转到这个 VC)

我想从 NewPost 中的 TextField 获取用户输入,并将其传递给 RecordViewWrapper,并最终将其显示为 VideoPlaybackViewController 上的标签

我的代码如下。当我尝试从 NewPost 移动到 RecordViewWrapper 时出现的错误是:

“线程 1:致命错误:未找到 Post2 类型的 ObservableObject。Post2 的 View.environmentObject(_:) 作为此视图的祖先可能会丢失。”

最新帖子

Post2(模型)

RecordVideoViewWrapper

记录视图

录制视频视图控制器

VideoPlaybackViewController

带有 RecordVideoViewController 和 VideoPlaybackViewController 的 Storyboard 屏幕截图

0 投票
2 回答
382 浏览

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

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

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

在我的View我有:

在钟面上我有:

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

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

objc[31175] 没有元类的类

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

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

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

0 投票
1 回答
2392 浏览

ios - Passing an ObservableObject model through another ObObject?

I feel like I can sort of understand why what I'm doing isn't working but I'm still trying to wrap my head around Combine and SwiftUI so any help here would be welcome.

Consider this example:

Single view app that stores some strings in UserDefaults, and uses those strings to display some Text labels. There are three buttons, one to update the title, and one each to update the two UserDefaults-stored strings to a random string.

The view is a dumb renderer view and the title string is stored directly in an ObservableObject view model. The view model has a published property that holds a reference to a UserSettings class that implements property wrappers to store the user defined strings to UserDefaults.

Observations:

• Tapping "Set A New Title" correctly updates the view to show the new value

• Tapping either of the "Set User Value" buttons does change the value internally, however the view does not refresh. If "Set A New Title" is tapped after one of these buttons, the new values are shown when the view body rebuilds for the title change.

View:

ViewModel:

UserSettings model:

When I put a breakpoint on willSet { objectWillChange.send() } in UserSettings I see that the objectWillChange message is going to the publisher when I would expect it to so that tells me that the issue is likely that the view or the view model is not properly subscribing to it. I know that if I had UserSettings as an @ObservedObject on the view this would work, but I feel like this should be done in the view model with Combine.

What am I missing here? I'm sure it's really obvious...