首页 > 解决方案 > 使用 SwiftUI 显示视图后,如何在设定的时间后更改变量?

问题描述

我有一个游戏的三种状态:开始,玩,结束。我想在游戏处于“开始”模式时显示一个视图,几秒钟后将游戏状态更改为“正在播放”并因此更改显示的视图。

这是我到目前为止所拥有的:

var body: some View {
    ZStack{
        Color(red: 0.96, green: 0.96, blue: 0.96).edgesIgnoringSafeArea(.all)
        if(skateGame.getState() == .start){
            Text("Start is active").onAppear(perform: {
                skateGame.startGame()
             })
                
        }else if(skateGame.getState() == .end){
            Text("done")
        }
    }
}

这是skateGame类的一些代码:

enum StateOfGame{
    case start
    case player1Set
    case player2Set
    case player1Try
    case player2Try
    case end
}

class SkateGamePlayLocal{
    
    private let player1 : Player
    private let player2 : Player
    private var stateOfGame : StateOfGame = .start
    
    init(player1: Player, player2: Player){
        self.player1 = player1
        self.player2 = player2
    }
    
    func startGame(){
        self.stateOfGame = .end
    }
    
    func getState() -> StateOfGame{
        return self.stateOfGame
    }
}

我将如何进行这项工作?

标签: swiftif-statementtimerswiftuistate

解决方案


问题是示例代码缺少两个计时器任何视图“状态”,计时器可能会更新以触发更新 UI,这两者对于使其工作都是必不可少的。

对于一个与所询问的内容类似的简单示例,请查看 HwS 的“如何在 SwiftUI 中使用计时器”

将计时器移出视图并移入SkateGamePlayLocal或类似的东西需要了解ObservableObject@Published@ObservedObject的作用@StateObject。再次值得一看 HwS 在这方面的资源,例如“与 @ObservedObject 共享 SwiftUI 状态”

祝你好运。


推荐阅读