[英]How to share published model between two view models in SwiftUI?
[英]How to share data between class and view in SwiftUI
我正在嘗試構建一個 2048 游戲來學習 SwiftUI,但我被卡住了。 我有三個班級,游戲、棋盤和瓷磚。 Game 有一個包含 Board 實例的變量,board 有一個包含 Tiles 矩陣的變量。
同樣,我有三個視圖,ContentView.swift、BoardView.swift 和 TilesView.swift
在視圖 ContentView.swift 我初始化游戲是這樣的:
@ObservedObject var game = Game()
...
Blocks(board: self.game.board)
然后在 BoardView.swift 中:
@ObservedObject var board: Board
... Loop ...
TileView(value: self.board.board[y][x].value)
...
.gesture(
DragGesture()
.onChanged({ value in
let direction = self.board.gestureToDirection(startLocation: value.startLocation, location: value.location)
self.board.move(direction: direction)
})
)
在 TileView.swift 中:
@State var value: Int = 0;
游戲.swift:
class Game: ObservableObject {
@Published var board = Board()
}
Board.swift :
class Board: ObservableObject {
@Published var board: [[Tile]] = []
/* Here is the logic of the game, when a gesture is triggered in ContentView.swift, I call a function to move the tiles */
}
Tiles.swift :
class Tile: ObservableObject {
@Published var coords: Coords
@Published var value: Int
}
我的問題是當我在屏幕上拖動時,板子沒有變化,而且我感覺我的板子在我的不同文件中的內容不一樣......
如何在視圖和類之間共享數據?
謝謝。
我相信這是因為@Published
更改未通過board: [[Tile]]
數組發布。 我遇到了類似的問題,例如這里。
要嘗試的一件事是為每個Tile
對象提供一個對擁有它的Board
的引用,並在需要發布更改時手動觸發 board 的objectWillChange
。
我會推薦以下更改(草率):
1) 創建一個模型, Tile
,一個值類型
struct Tile {
var coords: Coords
var value: Int
}
2) 制作一個TileView
,聽起來是一個Tile
,並給它一個模型作為綁定(@State 供內部使用,習慣給它private
)
struct TileView: View {
@Binding var model: Tile
...
3)在視圖之間進行綁定
TileView(model: self.$board.board[y][x])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.