问题标签 [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 回答
425 浏览

swift - 一个 ObservedObject 需要接受另一个 ObservedObject 作为参数;你怎么做到这一点?

显然,我不能像我想要的那样在 ContentView 创建时直接传递 VModel,因为 VModel 对象尚未创建,因此无法访问......

回顾:我想将在 ContentView 中声明的 VModel 实例传入 annotationsVM 实例(也在 ContentView 中声明)

0 投票
1 回答
2047 浏览

swift - 如何在 SwiftUI 中本地存储用户数据

我尝试完成具有已发布值的可观察对象training。在每次更改时,它都应将自定义结构保存为用户默认值。在每次加载(AppState init)时,它应该加载数据:

我知道这是否是最佳做法,但我想将数据保存在本地。我写的代码不起作用,我不知道为什么。

我是初学者,我从未将数据存储到设备中。

0 投票
1 回答
92 浏览

swift - 如何修复致命错误:索引超出范围

在我的多维列表中,当我尝试删除行时遇到问题 - 线程 1:致命错误:索引超出范围:

我重建了这种情况,因为我在一个具有更多代码的更大项目中遇到了这个问题。尤其是当我尝试删除有孩子的父母时,我在儿童视图中遇到了问题。对于没有孩子的父母,我可以删除它们。在这段代码中,我根本无法删除一行。

我认为这个问题在某种程度上与parentIndex视图通过可观察对象更改重新加载时没有减少有关。

0 投票
1 回答
784 浏览

swift - 在 Swift 测试驱动开发中对 @ObservableObject 进行单元测试

我正在尝试学习如何使用带有 TDD 的 MVVM 架构来解决一些无法在 SwiftUI 中对视图进行单元测试的问题。

我有一个带日期的警报结构:

我有一个基本的

AlarmPickerViewModel如果不是 的子类ObservableObject并且警报属性不是,我正在努力解决如何编写失败的单元测试@Published

我已经在网站上查看了这个问题,但它似乎对我没有帮助。

请问我哪里出错了?

0 投票
2 回答
489 浏览

swift - SwiftUI ObservedObject 导致不需要的可见视图更新

我正在开发一个将过滤器应用于图像的应用程序。过滤器有许多用户可以修改的参数。我创建了一个包含所述参数的 ObservableObject。每当其中一个参数发生变化时,视图都会有可见的更新,即使视图显示的值与以前相同。当我将参数建模为单独的 @State 变量时,不会发生这种情况。

如果这是意料之中的(毕竟观察到的对象确实发生了变化,因此依赖于它的每个视图都会更新),那么 ObservedObject 是否适合这项工作?另一方面,将参数建模为单独的@State/@Binding 变量似乎非常不方便,特别是如果需要将大量参数(例如10+)传递给多个子视图!

因此我的问题是:

我在这里正确使用 ObservedObject 吗?可见更新是无意的,但可以接受,还是在 swiftUI 中有更好的解决方案来处理这个问题?

使用@ObservedObject 的示例:

使用@State 变量的示例:

0 投票
1 回答
89 浏览

swift - 可观察对象不适用于 Published 关键字

我正在尝试编写一个属性包装器来访问 userDefaults 但有两个问题。代码片段如下

用户默认包装

可观察对象

上面的代码有效,但有以下问题

问题一:

我试图用@Published 关键字替换大部分样板代码,但是当我这样做时,我得到“'Double' 类型的值没有成员'wrappedValue'”错误,我无法理解/修复。

问题2:

保持代码不变,我使用步进器在我的设置屏幕上更新“focusSliderValue”,该屏幕在我的根视图上更新。如果我按下步进器一次并立即返回根视图得到正确更新但如果我按下步进器说 10 次然后返回根视图我会看到带有“...”(更新)符号的屏幕然后该字段几秒钟后更新。为什么这个过渡/可观察对象不平滑?

更新了问题 2 的 GIF

问题 2 的内容视图

编辑:更新了问题 2 的礼物

0 投票
0 回答
90 浏览

swiftui - SwiftUI Observable 对象在第一次尝试时不会更新 UI

问题

ViewModel 仅在@ObservableObject关闭并重新打开视图后更新 UI。一旦发生此更新,@Published内部 var中的每个后续更改都会@ObservableObject触发自动更新。

语境

我的项目中有一个名为“Stack”的模型。

我有一个视图(NavigationMenuView),它在滚动视图中显示所有堆栈导入 SwiftUI

此视图的视图模型有一个@Published var stacks = [Stack]()数组,该数组通过fetchStacks().

NavigationMenuView 有一个子视图(NewStackView),它使用这个按钮创建一个新的“堆栈”(使用 ViewModel):

我自己的进步

我发现这只发生在NewStackView作为 NavigationMenuView 的子视图呈现时。当使用 NewStackView 将其呈现为模态视图时.sheet(),会立即更新。

0 投票
1 回答
74 浏览

swiftui - SwiftUI:在渲染之间保留 ObservedObject

我的代码刚刚遇到一个不幸的问题:

我有很多以这种方式构建的视图。(一些)状态和逻辑被卸载到一个视图模型,该模型在onAppear.

问题是视图可能会被重新渲染,但onAppear只执行一次。结果是,只要视图被重新渲染一次或多次,视图模型中的任何状态都不会真正反映在视图中,因为只有第一个实例load()调用了它的方法。

有几种方法可以解决这个问题,但它们都有缺点:

  • 我可以将逻辑load()移到中init(),但这似乎很臭,因为init()它是用于属性分配等简单的事情,而不是用于设置订阅或其他外部访问。此外,我希望能够覆盖用于测试的视图模型逻辑,并且init()不能被覆盖。编辑:这里更大的问题是我们只想在视图出现时执行一次加载逻辑,而不是每次视图呈现时。
  • 我可以从父级传递视图模型,但是如果重新渲染父级,则可能会遇到同样的问题。
  • 我可以初始化视图模型SceneDelegate并将其作为@EnvironmentObject. .

我觉得有一种简单的方法可以实现我只是想念的。跳出框框思考,我使用视图模型的原因是为了分离关注点和便于单元测试。我希望视图只与视图模型提供的接口进行交互,而视图模型可以处理所有杂乱的数据访问。我也不确定是否有另一种方法可以在Publisher不使用ObservableObject.

0 投票
1 回答
314 浏览

ios - SwiftUI 选择器在 ObservedObject 公共变量更新期间滚动时跳转

目前正在创建一个 SwiftUI 应用程序,我在尝试解决 ObservedObject 和选择器的问题时遇到了困难。我的内容视图:

TimerManager 管理一个计时器。班上:

我需要从 ContentView 访问计时器类的 secondsLeft 变量以显示剩余时间。当计时器运行时,secondsLeft 变量会每秒更新一次,并且 ContentView 会重新呈现。问题是,当计时器运行时,我不能“轻弹”我的选择器,它总是重置,这里也指出:https ://forums.developer.apple.com/thread/127218 。但与那篇文章不同的是,选择器的“选择”变量对问题没有任何影响。如果我从 secondsLeft 变量中删除 @Public,一切正常(问题是我无法显示剩余时间)。

有人知道如何解决这个问题吗?

谢谢回答!

0 投票
1 回答
1003 浏览

ios - SwiftUI ForEach 未更新 ObservableObject 类数组的以下更改

背景

在我的应用程序中,我有一系列可以从另一个视图添加的朋友。我已经将这组朋友存储在一个类中,该类是ObservableObject. 在我的主视图中FriendListView,我使用 aForEach为用户添加的每个朋友显示自定义视图。

我无法添加到数组并让列表显示新项目。根据我能够理解和组合的内容,我尝试了两种不同的尝试。有人能够提供的任何帮助将不胜感激。我目前有显示第二个视图的方法,我将在其中添加一个注释掉的新朋友,并且一个自动保存新朋友的方法作为导航栏项目存在。

尝试

尝试#1

如果在类初始化程序期间将朋友附加到数组中,我就成功地显示了朋友列表。基于我能够打印数组的内容但 UI 没有更新,调用类方法从另一个视图添加到数组似乎有效。

这是通过使用一种ForEach(0..<Array.count)方法完成的,但是在添加新项目后我收到了以下控制台错误。

错误

型号代码

用户界面代码

尝试#2

在第一次尝试看到错误后,我阅读了如何跳过范围并仅提供数组作为其中的一部分,ForEach因为我在结构中使用我的 UUID 遵守Identifiable协议Pet。模型代码与我的第一次尝试相同,我更新的 UI 代码如下。请注意,唯一的变化是 ForEach 但我收到以下错误:

错误 Cannot convert value of type '[Pet]' to expected argument type 'Range<Int>'

用户界面代码