微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI 警报操作需要轻按两次

如何解决SwiftUI 警报操作需要轻按两次

以下警报中的所需操作(在 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 很有帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。