SwiftUI ObserveObject的不一致行为取决于调用站点的来源

SwiftUI ObserveObject的不一致行为取决于调用站点的来源,swiftui,sprite-kit,Swiftui,Sprite Kit,在将数据从SpriteKit场景传递到SwiftUI视图的持续探索中,我发现了以下奥秘(至少对我而言)。我希望解决办法能打破僵局。 我有一个ContentView,它使用SpriteView()来包含/显示名为GameSecene的SpriteKit场景。 我有一个名为Counter()的类,它被子类化为ObserveObject。(注意“添加(计数)”函数正文中的“打印”语句。) 在ContentView中,为了测试和比较,我添加了一个按钮,用于调用add(count)func: 当点击按钮(

在将数据从SpriteKit场景传递到SwiftUI视图的持续探索中,我发现了以下奥秘(至少对我而言)。我希望解决办法能打破僵局。 我有一个ContentView,它使用SpriteView()来包含/显示名为GameSecene的SpriteKit场景。 我有一个名为Counter()的类,它被子类化为ObserveObject。(注意“添加(计数)”函数正文中的“打印”语句。)

在ContentView中,为了测试和比较,我添加了一个按钮,用于调用add(count)func:

当点击按钮(在ContentView中)时,计数会增加,并按预期立即显示

在游戏场景中,我对add(count)func的调用几乎相同,但它无法(拒绝?)更新ContentView

class GameScene: SKScene {
var counter = Counter()
var count = 0
...
//a SpriteKitNode called "button" is created then added in didMove(toView)//
...
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        guard let touch = touches.first else { return }
        let location = touch.location(in: self)
        if button.contains(location) {
            counter.add(count: 1)
        }
    }
 }
class游戏场景:SKScene{
var counter=计数器()
变量计数=0
...
//创建名为“按钮”的SpriteKitNode,然后将其添加到didMove(toView)中//
...
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
guard let touch=touch.first else{return}
让位置=触摸。位置(in:self)
如果按钮包含(位置){
计数器。添加(计数:1)
}
}
}
无论调用来自GameSecene还是ContentView,print语句的读取都是相同的。第一次点击任何一个按钮,其内容如下:

加1;新总数:1

加1;新总数:2

加1;新总数:3,依此类推

换句话说,直到调用func来更新发布的var之前,它们的行为似乎是相同的。但是

神秘:

为什么来自ContentView的调用会触发所需的更新,而来自GameSecene的调用却不会


我期待着把我疲惫的眼睛上的鳞片去掉

游戏场景中
声明属性时,您正在创建一个全新的
计数器实例:

var counter = Counter()
相反,您应该将
ContentView
拥有的
Counter
实例传递给
GameScene
,以便它们对同一对象进行变异

您可以为
游戏场景
创建一个初始值设定项,将
计数器
作为参数,也可以执行以下操作:

//in GameScene:
var counter : Counter?
//in GameScene when the button is pressed:
counter?.add(count: 1)

//in ContentView:
let scene = GameScene()
scene.counter = counter

我遵循了@jnpdx的建议,这也要求在游戏场景中将调用更改为counter?.add(计数:1),现在它可以工作了。我怀疑问题在于实例的重新创建,并尝试使用var counter:counter?但我错过了对ContentView中场景的更改。非常感谢您抽出时间提供帮助!
var counter = Counter()
//in GameScene:
var counter : Counter?
//in GameScene when the button is pressed:
counter?.add(count: 1)

//in ContentView:
let scene = GameScene()
scene.counter = counter