【问题标题】:Communication between SpriteView and normal ViewSpriteView与普通View的通信
【发布时间】:2021-11-29 16:56:09
【问题描述】:

我目前正在做一个项目,我使用 SpriteView 来显示游戏内容和普通视图来显示菜单和导航。在普通视图中按下按钮时,我能够创建和加载 SpriteViews,但通信无法以其他方式工作。我希望能够通过使用子 SpriteView-Element 的按钮/SKShapeNodes 来更改父 View-Element 中的状态变量。

我尝试在两个实例之间绑定变量并使用回调函数。但我无法更改 View-Element 中的任何内容。

有没有一种简单有效的方法可以将请求从子 SpriteView 发送到父视图?

【问题讨论】:

    标签: swift xcode sprite-kit spriteview


    【解决方案1】:

    您可以为此使用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 视图。

    【讨论】:

      猜你喜欢
      • 2019-05-09
      • 1970-01-01
      • 2013-07-08
      • 2016-11-27
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 2014-11-08
      相关资源
      最近更新 更多