SwiftUI:如何从 ViewModel 的更改中切换警报演示者

Posted

技术标签:

【中文标题】SwiftUI:如何从 ViewModel 的更改中切换警报演示者【英文标题】:SwiftUI: How to toggle an alert presenter from a change in ViewModel 【发布时间】:2020-08-03 13:36:36 【问题描述】:

我在 SwiftUI 中有一个简单的游戏。这是视图(为了清楚起见,仅列出重要部分)。

struct MainScreen: View 
    @ObservedObject var game = GameEngine()

    @State var gameOver = false

    var body: some View 
        NavigationView 
            ZStack 
                Color.backgroundGray.edgesIgnoringSafeArea(.all)

                // MARK: - Screen Content
                VStack 
                
            
            .sheet(isPresented: $showLeader)  LeaderBoard(game: game) 
            .alert(isPresented: $gameOver) 
                Alert(title: Text("Game Over"),
                      message: Text("There are no more moves available."),
                      dismissButton: .default(Text("OK"), action: 
                        self.game.resetGame(boardSize: boardSize)
                        if game.state == .won 
                            self.showLeader.toggle()
                        
                      ))
            

GameEngine() 类的发布状态是一个枚举。每当 GameEngine State 属性为 .won 或 .over 时,我想更改 MainScreen @State 属性,但我不知道如何正确观察它。每当游戏情况发生变化时,模型中的该属性就会发生变化,因此不应在视图中更改它。

enum State 
    case start
    case won
    case running
    case over


@Published var state: State = .running 
    didSet 
        switch state 
        case .over:
            print("game over")
        case .won:
            let record = Record(playerName: playerName, score: score)
            leaderBoard.append(record)
            defaults.set(highest, forKey: "High Score")
        case .start:
            print("started")
        case .running:
            print("running")
        
    

【问题讨论】:

【参考方案1】:

你可以使用onReceive:

NavigationView 
    ...

.onReceive(game.$state)  state in 
    if [.won, .over].contains(state) 
        self.gameOver = true
    

【讨论】:

以上是关于SwiftUI:如何从 ViewModel 的更改中切换警报演示者的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中通过 ViewModel 传播模型更改?

SwiftUI 从 ViewModel 预填充 TextField

在 SwiftUI 组件之间共享 ViewModel

SwiftUI 将@Published viewmodel 对象值传递给@Binding

基于 VIewModel 状态更新 SwiftUI 视图?

SwiftUI MVVM 将变量从 ViewModel 传递到 API 服务