当按下按钮时,一个玩家被添加到游戏中,我想通过视图模型观察游戏中的变化。当我按下按钮时,计数器没有改变。
就好像我需要 中的游戏既是ContentViewModel又@ObservedObject是@Published。
有人可以帮助我了解为什么设置错误以及如何修复它的基本原理吗?
import SwiftUI
import Combine
class Game: ObservableObject {
@Published var players: [String] = []
func addPlayer(_ player: String) {
players.append(player)
}
}
class ContentViewModel: ObservableObject {
@Published var game: Game {
didSet {
subscription = game.objectWillChange.sink { [weak self] _ in
self?.objectWillChange.send()
}
}
}
var subscription: AnyCancellable?
init(game: Game) {
self.game = game
}
}
struct ContentView: View {
@ObservedObject var viewModel: ContentViewModel
var body: some View {
Text("Num players: \(viewModel.game.players.count)")
.padding()
Button("Add player") {
viewModel.game.addPlayer("player")
}
}
}
Run Code Online (Sandbox Code Playgroud)
您想要设置subscription在init. 这将确保每次game对象实例发生更改时,您也会触发ContentViewModel更改。
您的代码不起作用,因为只有对象实例正在发生变化 - 而不是对象引用。所以game不会触发didSet,因此你永远不会设置subscription。
代码:
class ContentViewModel: ObservableObject {
@Published var game: Game
var subscription: AnyCancellable?
init(game: Game) {
self.game = game
subscription = game.objectWillChange.sink { [weak self] _ in
self?.objectWillChange.send()
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5153 次 |
| 最近记录: |