SwiftUI ObserveObject用作环境对象奇数行为
我使用SwiftUI ObserveObject用作环境对象奇数行为,swiftui,combine,observableobject,Swiftui,Combine,Observableobject,我使用environmentObject()将这样的observateObject注入到视图层次结构中 class菜单模型:ObservableObject{ @已发布的变量选择:Int=0 @已发布变量isMenuOpen:Bool=false @已发布变量tabItems:[TabItem]=[TabItem]() // { //迪塞特{ //objectWillChange.send() // } // } @已发布变量menuItems:[MenuItem]=[
environmentObject()
将这样的observateObject
注入到视图层次结构中
class菜单模型:ObservableObject{
@已发布的变量选择:Int=0
@已发布变量isMenuOpen:Bool=false
@已发布变量tabItems:[TabItem]=[TabItem]()
// {
//迪塞特{
//objectWillChange.send()
// }
// }
@已发布变量menuItems:[MenuItem]=[MenuItem]()
// {
//迪塞特{
//objectWillChange.send()
// }
// }
//var objectWillChange=PassthroughSubject()
}
以下是我并不十分了解的问题:
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>()
}
class Click5MenuModel:ObservableObject{
@已发布的变量选择:Int=0
@已发布变量isMenuOpen:Bool=false
变量tabItems:[TabItem]=[TabItem]()
{
迪塞特{
objectWillChange.send()
}
}
变量menuItems:[MenuItem]=[MenuItem]()
{
迪塞特{
objectWillChange.send()
}
}
var objectWillChange=PassthroughSubject()
}
然后@Published properties停止刷新依赖于此observeObject的视图!
这是为什么。我还尝试使用objectWillChange.send()
添加didSet
,但这也会导致一些奇怪的行为,代码有点笨拙
这是否意味着我只能使用仅@Published或仅objectWillChange方法?默认实现只起作用(只要您有@Published属性)。以下是API声明: 因此,删除以下内容:
var objectWillChange = PassthroughSubject<Void, Never>()
你只是想知道原因还是如何让它发挥作用?因为通过我的测试,删除本地定义的
objectWillChange
并使用继承自didSet
中的observeObject
,即didSet{self.objectWillChange.send()}
按预期更新视图。以防万一。objectWillChange是我的本地定义吗?所以我不应该把它放在任何地方?我在大多数示例中使用它时添加了这一点,但正如您所说,我应该只在didSet中调用它?我认为在使用didSet
而不是willSet
调用objectWillChange
时,您必须期望出现奇怪的行为。在此进行有益的讨论:
/// 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()
}