Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI ObserveObject用作环境对象奇数行为_Swiftui_Combine_Observableobject - Fatal编程技术网

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()
}