问题标签 [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.
swift - 成功登录后,SwiftUI ObservedObject 未更新视图
为了在成功登录后从我的根视图显示我的内容,我尝试使用ObservedObject
和EnvironmentObject
,但无济于事。
例如如下:
LoginManager
保留在环境中SceneDelegate
并放入环境中:
登录后,它会直接回到我的WelcomeView
. 我错过了什么?
编辑
这是一个新的方面。我有一个视图模型LoginView
来管理日期字段中的数据。当登录按钮被按下时,我login()
在这个视图模型中调用一个方法。
我需要.sink
在视图模型中进行两个回调,因为我必须通过将loading
标志设置为 false 来关闭加载指示器。
所以我不能self.isLoggedIn = true
直接调用,因为我在视图模型中,而不是LoginManager
. 相反,我打电话
我怀疑这条线不起作用。
视图模型和登录管理器之间的连接是这样完成的
但是,在将其转移到 之后LoginManager
,我确实是self.isLoggedIn
从那里打电话的。它仍然无法正常工作。
我有两篇论文:
可能是视图没有正确设置
Group
等。我也尝试使用@ViewBuilder
等,没有区别。可能以某种方式存在两个实例
LoginManager
,或者以RootView
某种方式重新初始化了一个新实例,其中isLoggedIn
为假。但我多年来一直在创建这样的 Swift 单例:静态让共享 = LoginManager()
从来没有任何问题。
正如评论中提到的,我在全部切换到时遇到了另一个错误@EnvironmentObject
:
Fatal error: No ObservableObject of type LoginManager found. A View.environmentObject(_:) for LoginManager may be missing as an ancestor of this view.: file SwiftUI, line 0
swift - Swift UI DatePicker 不会更新 @ObservedObject 值
我正在使用一个类来存储 @Published 变量,但是当我尝试将自定义 DatePicker 上选择的值传递给类中的 @ObservedObject 时,我收到以下错误:
无法将“Binding”(又名“Binding”)类型的值转换为预期的参数类型“TimeModel”
如何使用选择器值更新 @ObservedObject?
完整代码:
swiftui - @EnvironmentObject 和 @ObservedObject 有什么区别?
我一直在阅读 SwiftUI 中的属性包装器,我发现它们做得很好,但我真正不明白的一件事是@EnvironmentObject和@ObservedObject之间的区别。
从我目前学到的知识来看,当我们在应用程序的各个地方都需要一个对象但我们不需要将它传递给所有这些对象时,我看到使用@EnvironmentObject 。例如,如果我们有层次结构 A -> B -> C -> D 并且对象是在 A 处创建的,它会保存在环境中,以便我们可以将它直接从 A 传递给 D,如果 D 需要它。
如果我们使用在 A 处创建并需要传递给 D 的@ObservedObject ,那么我们也需要经过 B 和 C。
但我仍然不知道如何决定使用哪一个。以下是我制作的 2 个示例项目:
和
两个代码都对视图进行相同的更新。两个 ContentView 也都传递一个Order对象。不同之处在于 Environment 传递 .environmentObject(order)而 Observed 直接传递EditView(order: order)。对我来说,两者都做同样的工作,只是他们的声明不同,因此我希望得到一些解释或更好的例子。
json - json解码的存储结果突然消失/观察对象在WatchOS中没有反应
我将 json 数据从 iPhone 解码到手表并将其存储到声明为 @ObservableObject 的对象(自定义类:PeopleObj)中。但是,包含此对象的内容视图没有获取数据
这是数据模型:
以下是 WatchOS 的解码部分,这里我将 json 数据作为对请求的回复,并将其解码为 peopleObj:
这是contenview,观察对象:
我尝试将 json 解码为一个结构,然后手动将值添加到 peopleObj - 这有效,但对我来说似乎不是正确的过程!我无法解释为什么,猜想它与价值与引用有关。
任何帮助和/或想法都非常受欢迎!!!!!!!
编辑: peopleObj 在 HostingController 中定义:
从 HostingController 调用 ContentView
swiftui - SwiftUI 如何将全局变量传递给非视图类
我了解如何使用 @EnvironmentObject 使全局数据可用于任何视图类,但我找不到将变量传递给非视图类的方法。
我的情况,这似乎是一个常见的问题,是:
- 登录,返回访问令牌。在所有后续的 api 调用中都需要使用此令牌
- 将访问令牌存储在 UserSettings 类中
- 将 UserSettings 放在 Environment 存储桶中
- 每个视图将根据 api 调用中返回的数据显示数据
- Categories() 是一个非视图 Swift 类,它将检索数据,但需要存储在 UserSettings 中的访问令牌
UserSettings 是空的,因为该类不是 View 结构,并且其行为似乎不像 View 类。由于我需要的访问令牌存储在 UserSettings 类中,我如何才能访问它?是否有另一种方法来存储/访问这些数据?
swiftui - 发布值时,SwiftUI ObservableObject 未更新
我有一个视图和一个 viewModel,当用户添加到用户数组时应该更新 ListView。我可以验证是否正在添加用户,但 ObservedObject 没有更新。
我有一个搜索栏,可让您搜索用户,然后更新 ViewModel 中的用户数组,该数组应该更新 View 但它没有。
视图模型
看法
swift - 在 SwiftUI 中更新树结构的 UI
我有一个 ObservableObject 类,Model0
它有一个Published
object nested
。该nested
对象表示递归树结构。我希望能够更新树结构并适当地更新 UI。但是,在下面的代码中,当我更新对象的子nested
对象时,UI 没有更新,我假设是因为对的引用nested
没有改变。nested
每当我更改树结构中的任何对象时,如何让 UI 更新?
ios - SwiftUI 通过引用一个类对象到另一个视图
我正在尝试学习 SwiftUI,我将开发一个带有选项卡视图的简单应用程序,并在这些视图之间共享核心运动数据。
主要思想是创建一个运动管理器对象(如这里)并在所有视图中使用传感器值。
ContentView.swift
:
View1.swift
:
View2.swift
:
View21.swift
使用这些代码,我可以使用 中的传感器数据View21
,但无法访问上述层次结构中视图中的数据。
此外,我@ObservedObject
在 ContentView 中创建(如此处)并将其传递给所有视图。我的应用程序在模拟器中工作,但它不在真实设备上。我可以看到传感器数据发生变化,但无法切换选项卡视图。我尝试使用@EnvironementObject
而不是@ObservedObject
,但行为是相同的。
对于我的问题的任何帮助和提示,我将非常感谢。最良好的祝愿
swiftui - SwiftUI ObservedObject 未跨视图更新
我无法让可观察的对象模型工作。
我有两个视图和一个视图模型的简单演示。视图模型是;
一个按钮视图,可将总数加一;
然后是一个开始视图来显示结果;
如果我将类、按钮和开始视图放在一个文件中,它就可以工作
swiftui - 如何通知符合协议的 ObservedObject 的更改
我正在构建一个 AutoCompletion 视图,并希望传递一个包含要自动完成的字段的对象。目前我有两种不同的类型,我需要在一个属性上自动完成,这两个属性的名称相同。我创建了一个协议,并使用它来构建一个通用视图来接受它。
我遇到的问题是 onReceive 破坏了编译。不幸的是,除了“无法推断复杂的闭包返回类型...”之外,我无法收到错误消息,但如果我注释掉 onReceive,错误就会清除。
如果我将结构中的 LocationNameAutoComplete 替换为 Address,那么它可以编译并运行良好 - 但这意味着我不能将它与其他类型的 FactorySite 一起使用。
如果我能看到有关 onReceive 的实际错误消息,那将是一个开始......
有没有更好的方法来做到这一点?
谢谢