1

プレビューは通常、環境オブジェクトで正常に動作しますが、オブジェクト内でオブジェクトの配列にアクセスするときに問題が発生します。

次のビューはプレビューに表示されませんが、正常に機能します

import SwiftUI

struct ScoreCell: View {

    @EnvironmentObject var game : Game

    var player: Player

    var body: some View {
        VStack {  
            Text(String(self.game.playerScores[self.game.indexOfPlayerInScores(player: player)].totalScore()))
        }
    }
}

struct ScoreCell_Previews: PreviewProvider {
    static var previews: some View {
        ScoreCell(player: Player(name: "s", shortName: "Steph", photoURL: "steph", color: Color(.cyan)))
            .environmentObject(Game())
    }
}

ハードコードされたインデックスに置き換えると、問題なく動作します(下の行のように)

Text(String(self.game.playerScores[0].totalScore()))

追加情報:

  • var "player" は、ビューの別の行で正常に動作します
  • playerScores は、以下のように定義された playerScore の配列です。
struct PlayerScore {
    let player: Player
    var pointsList: [Int]     


    func totalScore() -> Int {
        return pointsList.reduce(0, +)
    }
}

私は間違いなくプレビューなしで作業できますが、後で私を悩ませるより一般的な問題を隠していると感じています...助けてくれてありがとう。

潜在的な情報を提供するためにゲームのコードを追加する - ありがとう

import SwiftUI
import Combine

class Game: ObservableObject {

    var players = [Player] ()
    @Published var playerScores = [PlayerScore] ()

    func addPlayer(player: Player) {
        players.append(player)
        playerScores.append(PlayerScore(player: player, pointsList: [0]))
    }

    func addPlayer(player: Player, score: Int) {
        players.append(player)
        playerScores.append(PlayerScore(player: player, pointsList: [score]))
    }

    func indexOfPlayerInScores(player: Player) -> Int {
        return  playerScores.firstIndex(where: {$0.player.id == player.id})!
    }

    init () {
        self.addPlayer(player: Player(name: "Stephane", shortName: "Steph", photoURL:"steph", color: Color(.sRGB,red: 90/255, green: 197/255, blue: 191/255)))
        self.addPlayer(player: Player(name: "Sophie", shortName: "Sof", photoURL:"sof", color: Color(.sRGB, red: 189/255, green: 0/255, blue: 82/255)))
        self.addPlayer(player: Player(name: "Chloe", shortName: "Chloe", photoURL:"chloe", color: Color(.sRGB,red: 251/255, green: 78/255, blue: 84/255)))
        self.addPlayer(player: Player(name: "Stephane", shortName: "Gaby", photoURL:"gaby", color: Color(.sRGB,red: 255/255, green: 195/255, blue: 11/255)))
    }


}
4

1 に答える 1