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