我目前正在做一个项目,我使用SpriteView来显示游戏内容,使用普通视图来显示菜单和导航。我能够在正常视图中按下按钮时创建和加载SpriteViews,但通信不以其他方式工作。我希望能够通过使用子SpriteView-Element的按钮/SKShapeNodes来改变父View-Element中的状态变量。
我尝试在两个实例之间绑定变量并使用回调函数。但是我无法更改View-Element中的任何内容。
是否有一种简单有效的方法从子- spriteview发送请求到父- view ?
您可以使用ObservableObject
-@Published
模式。
让你的GameScene
符合ObservableObject
协议,并发布你感兴趣的属性,将值发送到SwiftUI视图,像这样:
class GameScene: SKScene, ObservableObject {
@Published var updates = 0
@Published var isPressed = false
// ...
}
然后,在你的SwiftUI视图中,使用@StateObject
属性(或@ObservedObject
或@EnvironmentObject
)来存储GameScene
实例。然后你可以在你的SwiftUI视图中使用GameScene
的发布属性:
struct ContentView: View {
@StateObject private var scene: GameScene = {
let scene = GameScene()
scene.size = CGSize(width: 300, height: 400)
return scene
}()
var body: some View {
ZStack {
SpriteView(scene: scene).ignoresSafeArea()
VStack {
Text("Updates from SKScene: (scene.updates)")
if scene.isPressed {
Text("isPressed is true inside GameScene")
}
}
}
}
}
当你"按下普通视图中的按钮"时,改变已发布属性的值,它们会改变使用它们的SwiftUI视图。