簡體   English   中英

如何在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM