问题描述
以下警报中的所需操作(在 SwiftUI 视图中)仅在第二次点击主按钮(“是”)后(在警报第二次出现时):
.alert(isPresented: $viewmodel.showingalert) {
Alert(
title: Text("Confirm your Selection"),message: Text("Are you sure?"),primaryButton: .default (Text("Yes")) {
handleGameOver()
},secondaryButton: .destructive (
Text("No (try again)"))
)
}
如下所示,handleGameOver() 更新了 viewmodel 中的两个 bool,它被 SKScene“观察到”,其中“showingSolution == true”向场景添加了一个 childNode。
func handleGameOver() {
viewmodel.showingSolution = true
viewmodel.respondToTap = false
gameOver = true
}
进一步参考...
以下是我的设置方式:
游戏视图模型:
final class Gameviewmodel: ObservableObject {
@Published var showingalert = false
@Published var tapOnTarget = false
@Published var respondToTap = true
@Published var showingSolution = false
}
在 SwiftUI 视图中:
struct GameView: View {
@Observedobject var viewmodel: Gameviewmodel
@Binding var showingGameScene : Bool
@Binding var gameOver: Bool
var scene: SKScene {
let scene = GameScene()
scene.size = CGSize(width: 400,height: 300)
scene.scaleMode = .aspectFit
scene.backgroundColor = UIColor(.clear)
scene.viewmodel = viewmodel
return scene
}
var body: some View { ...
SpriteView(scene: scene)
...
最后,在 SKScene 中:
class GameScene: SKScene {
var viewmodel: Gameviewmodel?
...
“showingalert”在“touchesBegan”中设置为“viewmodel?.showingalert = true”。
我不能离开,因为第二次尝试就可以了。但显然这还不够好。 我做错了什么??
解决方法
受到 Cuneyt 评论的启发,我重新审视了我有问题的帖子,并能够发现我在这个过程中的错误: 在 GameView 中,我使用了
@ObservedObject var viewModel: GameViewModel
该对象是在 GameView 中创建的,所以我需要使用:
@StateObject var viewModel: GameViewModel
讨论在 What is the difference between ObservedObject and StateObject in SwiftUI 很有帮助。