首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将数据从SpriteKit场景传回SwiftUI

将数据从SpriteKit场景传回SwiftUI
EN

Stack Overflow用户
提问于 2021-03-06 16:54:47
回答 1查看 240关注 0票数 0

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

代码语言:javascript
运行
复制
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是这样的:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
@EnvironmentObject var game: GameTracker


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

当所有内容都在SwiftUI视图中时,这非常有效。但是当我从SpriteKit GameScene调用game.add(newItem)时,我得不到相同的结果。

EN

回答 1

Stack Overflow用户

发布于 2021-05-01 00:35:09

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

试试这个:

代码语言:javascript
运行
复制
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)
   }
}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66503964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档