将数据从 SpriteKit 场景传递回 SwiftUI

问题描述 投票:0回答:2

我已经为此苦苦挣扎了一段时间。它让我彻夜难眠,早上不敢起床。 我有一个 SwiftUI ContentView,我从中调用一个名为 GameScene 的 SpriteKit 场景。 游戏结束后,我想用分数更新 ContentView。 事实证明这比我想象的要困难得多。 我尝试过 @EnvironmentObject、@Bindings、(等)UserDefaults、userData(在 SK 场景中)...将数据传递到 GameScene 很简单,但是当得分时如何让 ContentView 更新(重绘自身)变化? 我知道我们应该展示示例代码,但是,坦率地说,我已经尝试了很多次,尝试了很多方法,我不知道从哪里开始。如果有人可以向我保证这是可能的(首先)并且也许为我指出正确的方向,我将非常感激! (并承诺如果我找到解决方案,我会分享我的解决方案。)谢谢! 这是我的 ObservableObject 类:

final class GameTracker: ObservableObject {
@Published var items: [CompletedChallenge] = []

var totalScore: Int {
    items.reduce(0) {$0 + $1.points}
}

func add(_ completedItem: CompletedChallenge) {
    items.append(completedItem)
   }
}
}

ContentView是这样的:

struct ContentView: View {
@EnvironmentObject var game: GameTracker
var body: some View {
    
    VStack{
        NavigationView {
            List{
                ForEach(selectedChallenges) { challenge in
                    NavigationLink(
                        destination: DetailView(challenge: challenge)
                    ) {
                        HStack{
                            Image(systemName: game.items.contains { item in
                                item.challenge == challenge }
                                    ? "checkmark.circle.fill" : "arrowtriangle.right.circle")
                                .foregroundColor(.orange)
                            Text(challenge.name)
                            Spacer()
                        }
                        
                    }
                }
            }
            .navigationBarTitle(Text("Challenges"))
        }       
        Text("Score: \(game.totalScore)")
    }
}
}

在此示例中,选定的列表项导航到 DetailView,我可以在其中更新 ObservableObject:

@EnvironmentObject var game: GameTracker


 ...
        let newItem = CompletedChallenge(challenge: challenge, points: challenge.maxPoints)
        game.add(newItem)

当一切都在 SwiftUI 视图中时,这非常有用。但是当我从 SpriteKit GameScene 调用 game.add(newItem) 时,我无法得到相同的结果。

swiftui sprite-kit
2个回答
0
投票

您的

totalScore
属性不是
@Published
,因此当值更改时 SwiftUI 视图不会更新。

试试这个:

final class GameTracker: ObservableObject {
@Published var items: [CompletedChallenge] = []

@Published var totalScore: Int {   // <-- Here!
    items.reduce(0) {$0 + $1.points}
}

func add(_ completedItem: CompletedChallenge) {
    items.append(completedItem)
   }
}
}

© www.soinside.com 2019 - 2024. All rights reserved.