Как обмениваться данными между классом и представлением в SwiftUI - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь создать игру 2048 для изучения SwiftUI, но я застрял. У меня есть три класса, Game, Board и Tiles. В игре есть переменная, которая содержит экземпляр 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;

Game.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
}

Моя проблема в том, что когда я перетаскиваю экран, доска не меняется, и у меня возникает ощущение, что содержимое моя доска не одинакова в разных моих файлах ...

Как я могу делиться данными между представлениями и классами?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020

Я бы порекомендовал следующие изменения (неестественно):

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])
0 голосов
/ 29 февраля 2020

Я полагаю, это потому, что изменения @Published не публикуются в массиве board: [[Tile]]. Я сталкивался с подобными проблемами, например, здесь .

Одна из попыток - дать каждому объекту Tile ссылку на Board, которому он принадлежит, и вручную вызвать доску objectWillChange, когда изменения нуждаются в публикации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...