我已经在这个问题上挣扎了一段时间。它让我晚上睡不着觉,让我早上不敢起床。我有一个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)时,我得不到相同的结果。
发布于 2021-05-01 00:35:09
您的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)
}
}
}https://stackoverflow.com/questions/66503964
复制相似问题