swiftui - SwiftUI ObservableObject 用作 EnvironmentObject 奇怪的行为
问题描述
我有这样ObservableObject
的情况,我通过使用environmentObject()
.
class MenuModel: ObservableObject {
@Published var selection: Int = 0
@Published var isMenuOpen: Bool = false
@Published var tabItems : [TabItem] = [TabItem]()
// {
// didSet {
// objectWillChange.send()
// }
// }
@Published var menuItems : [MenuItem] = [MenuItem]()
// {
// didSet {
// objectWillChange.send()
// }
// }
//var objectWillChange = PassthroughSubject<Void, Never>()
}
以下是我不太了解的问题: 1. 上面的代码可以正常工作,因为所有属性都是@Published。2. 但是如果我把它改成这样
class Click5MenuModel: ObservableObject {
@Published var selection: Int = 0
@Published var isMenuOpen: Bool = false
var tabItems : [TabItem] = [TabItem]()
{
didSet {
objectWillChange.send()
}
}
var menuItems : [MenuItem] = [MenuItem]()
{
didSet {
objectWillChange.send()
}
}
var objectWillChange = PassthroughSubject<Void, Never>()
}
然后@Published 属性停止刷新依赖于这个 ObservableObject 的视图!这是为什么。我也尝试添加didSet
,objectWillChange.send()
但这也会导致一些奇怪的行为,并且代码有点尴尬。
这是否意味着我只能使用@Published或ONLY objectWillChange方法?
解决方案
默认实现才有效(只要您有 @Published 属性)。这是来自API声明:
/// By default an `ObservableObject` will synthesize an `objectWillChange` /// publisher that emits before any of its `@Published` properties changes: ... @available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension ObservableObject where Self.ObjectWillChangePublisher == ObservableObjectPublisher { /// A publisher that emits before the object has changed. public var objectWillChange: ObservableObjectPublisher { get } }
所以删除以下内容:
var objectWillChange = PassthroughSubject<Void, Never>()
并使用
didSet {
self.objectWillChange.send()
}
推荐阅读
- llvm - 为什么我不能在指令组合中使用虚拟寄存器变量?
- python-pptx - 在嵌套for循环的多个目录中迭代imagis,第n个循环重复前一个循环的最后一项 - Python
- c - 如何让程序在 C 中向自身发送 SIGINT?
- node.js - 如何用聚合的mongo减去2个具有相同goods_info.name的子文档
- c++ - 为什么 C++ 编译器内联字符串文字的一部分?
- pandas - 当 as_index=True 时,Pandas groupby 添加额外的数字
- mysql - 如何在 SUM() 中添加 SELECT 查询以显示论坛中的评论总数?
- r - 为每个客户制定一个“加权平均”变量
- go - 为什么标准库 bufio.Read(p []byte) (int, err) 在 Go 中检查 len(p) 而不是 cap(p)
- php - 如何修复无法在 postgresql 中执行查询错误?