问题标签 [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 投票
0 回答
398 浏览

swift - 如何在 SwiftUI 中使用 UserDefaults 从 DatePicker 中保存/检索?

我正在尝试使用 DatePicker 选择一天中的特定时间,然后在选择该时间后,将时间保存为 ObservedObject 并使用 SwiftUI 将其保存到我的 UserDefaults 中。下面我的代码的问题是,虽然数据在时间的初始设置后被保存,但如果时间改变,该更新不会像我期望的那样显示在我的 DatePicker 对象中。任何人都可以帮助看看我在这里的代码做错了什么:

用户数据.swift

AlarmSettingsView.swift

0 投票
0 回答
451 浏览

validation - SwiftUI:它如何刷新视图以及为什么 @Published ObservableObject 属性随机工作

在我看来,SwiftUI 的工作方式越来越令人困惑。乍一看,它接缝快速且易于掌握。但是,如果您添加越来越多的视图,那么看起来很简单的事情就会开始表现得很奇怪,并且需要很多时间来解决。

我有Input验证字段。这是自定义输入,我可以在很多地方重复使用。但是在不同的屏幕上,这可能会完全不同并且完全不可靠。

用表格查看

LabeledInput - 具有验证支持的可重用自定义输入视图

下面是我在 ObservableObject 即 LoginViewModel 中存储模型(输入值和验证)的方式。

当我根据视图父视图(屏幕)创建 ViewModel(在 LoginView 属性中或注入到 LoginView 构造函数)的方式使用此代码时,它嵌入的工作方式可能完全不同,可能会导致数小时的调试和意外行为。

  1. 有时似乎有 1 个 ViewModel 实例有时似乎每次 View 刷新都会创建此实例
  2. 有时 LabeledInput 正文令人耳目一新,并且标签的验证着色工作正常。其他时候它似乎根本没有刷新,也没有任何反应
  3. 有时刷新如此频繁键盘立即隐藏
  4. 其他时候根本没有验证
  5. 退出字段后或将手机横向旋转为纵向时,其他时间输入丢失
  6. 如果有一些事件导致父视图刷新,它可能会导致输入丢失数据和验证。
  7. 有时它会经常刷新,有时它根本不会刷新。

我尝试添加 .id(UUID) 、自定义 .id(refreshId) 或其他 Equatable 协议实现,但它不能按预期工作,因为它是可重用的自定义输入,验证可在多个屏幕上的多个表单之间重用。

这是简单的验证结构

而这里 FieldValidator ObservableObject

规则只是

更新

完整的 UIKitTextField 示例

这是示例 EmailRule 实现

0 投票
2 回答
1210 浏览

swiftui - SwiftUI - 在加载视图后更新属性时,不会为 ObservableObject 属性更改调用 onReceive

我有一个视图,它在滚动视图中显示从 API 加载的几张照片。我想推迟获取图像,直到显示视图。我的观点,简化看起来像这样:

我的视图模型如下所示:

如果我在init视图模型的方法中获取数据,则在设置onReceive@PublishedimageUrls属性时会调用视图上的块。但是,当我fetchinit方法中删除并从视图中调用时,使用:

即使数据已更新,也不会调用for onReceiveviewModel.objectWillChange我不知道为什么会这样,并且非常感谢这里的任何帮助。

0 投票
2 回答
8767 浏览

ios - SwiftUI - 更改 @Published 结构时是否可以触发 didSet?

我刚刚更新到 XCode 11.4,我的一些代码已经停止工作。我@Published在一个ObservableObject. 以前,当我更新结构上的属性时,该didSet方法会在发布的属性上触发,但现在情况不再如此。这种行为是否有可能在 Swift 的最新更新中被设计改变了?

这是一个简单的例子:

该属性会更新,但didSet不会触发。

是否可以获取结构的嵌套属性来触发didSet发布者的方法?

0 投票
2 回答
2098 浏览

swift - 有没有办法在 Swift Combine 中多次调用 assign()?

我想用处理新发布的值时收到的值更新一些变量。例如,给定:

我还想将 XPublisher 和 YPublisher 的新值分配给变量(分别为 PublishedX 和 PublishedY)。

有没有办法设置这两个变量然后继续处理事件?

0 投票
4 回答
27208 浏览

ios - SwiftUI 视图未基于 @ObservedObject 更新

在下面的代码中,观察到的对象会更新,但观察它的 View 不会。知道为什么吗?

该代码在屏幕上显示 10 个数字 (0..<10) 和一个按钮。每当按下按钮时,它会随机选择 10 个数字之一并翻转其可见性(可见→隐藏,反之亦然)。

打印语句显示按钮正在更新数字,但视图没有相应更新。我知道更新数组中的值不会改变数组值本身,所以我使用手动objectWillChange.send()调用。我原以为应该触发更新,但屏幕永远不会改变。

任何想法?我会对使用NumberLine作为类或结构或根本不使用NumberLine类型而是仅在ContentView结构中使用数组变量的解决方案感兴趣。

截屏

这是代码:

0 投票
1 回答
6009 浏览

swift - 运算符函数'>'要求'UserRating'符合'BinaryInteger' - SwiftUI ObservableObject

首先 - 这些是我使用 ObservableObjects 的第一步,也许它只是一个小错误......

我尝试创建一个带有星星的评分栏(使用 paul hudson 教程),但有一个变量将用于 2 个以上的视图,所以我需要一个 ObservableObject。

Rating 在 Rating.swift 中创建,将在 FeedbackView.swift 中调用,FeedbackView.swift 将由 EKLComplete.swift 中的 TabBar 调用。

我用@Binding var 尝试了“Paul Hudson Way”,但我的代码与 Pauls 教程中的不同。我的观点都希望有变量,这是正确的 - 因为绑定。据我了解,@Binding 允许我与 2 个视图共享变量,在我的情况下,我的 EKLComplete 视图也想知道该值,所以它必须是一个 ObservableObject,对吧?

创建类后:

并在 3 个视图中使用以下代码实例化变量

在此处输入图像描述

这是我的代码,它会引发错误。

我收到以下错误消息:

运算符函数“>”要求“UserRating”符合“BinaryInteger”

这不起作用... 1. 说我的评级是 Int 2. 在我的班级中初始化评级

谢谢你的帮助!

0 投票
0 回答
260 浏览

swiftui - 如何避免致命错误:SwiftUI 中没有 ... 类型的 ObservableObject?

我将事情简化为这个非常简单的示例(一个普通的 SwiftUI 项目,仅编辑 ContentView 和 SceneDelegate 中的一行)。设置一个微不足道的 ObservableObject 和几个屏幕视图。使用最新的 Xcode 11.4 和模拟器很容易崩溃。

难道我做错了什么?或者这是一个 SwiftUI 错误?它最初似乎工作正常,然后重新导航到子视图时它崩溃了。虽然确切的行为是不确定的(可能会在第二次或第三次导航时崩溃!)

0 投票
1 回答
346 浏览

ios - 当 ObservedObject 在其他类中发生更改时如何在 ContentView 中运行方法 [Swift 5 iOS 13.4]

这是我的基本内容视图

这是我的模型

我不确定它是否可以访问?或者如果我可以从 View 观察 ObservableObject 的变化并运行任何方法?

提前致谢!

0 投票
2 回答
1227 浏览

swift - SwiftUI 观察变化

概述:

  • 我有一个名为 Player 的类和一个名为 Song 的类。
  • 播放器包含一首歌曲
  • 视图正在显示歌曲标题

目标:

当我更改 player.song.title 时,需要更新视图。

问题:

当歌曲的属性发生变化时,它不会自动更新视图。只有分配新歌曲时,才会反映更改。

我的尝试:

我做了 2 次尝试(下面的代码),都按预期工作。

问题:

  • 有更好的方法吗?(这似乎是一个常见问题,人们会遇到。)我的尝试是否合理,尝试 2 是否更好?
  • 还是我的设计存在根本缺陷?(我希望将歌曲放在播放器中,因为它代表了当前歌曲)。

原始代码(视图不会更新):

模型

看法

Attempt1 - 使用 CombineLatest

问题:随着歌曲中属性数量的增加,它的可扩展性不是很好。

Attemp2:使用 objectWillChange.sink