Swiftui 画布预览不';访问包含对象数组的environmentObject时不显示
预览通常适用于环境对象,但在对象内访问对象数组时遇到问题 以下视图不显示在预览中,但在Simulator中运行良好Swiftui 画布预览不';访问包含对象数组的environmentObject时不显示,swiftui,xcode11.3,Swiftui,Xcode11.3,预览通常适用于环境对象,但在对象内访问对象数组时遇到问题 以下视图不显示在预览中,但在Simulator中运行良好 import SwiftUI struct ScoreCell: View { @EnvironmentObject var game : Game var player: Player var body: some View { VStack { Text(String(self.game.playerS
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())
}
}
如果我用一个硬编码索引替换它,它就可以正常工作(如下面的行中所示)
其他信息:
- var“player”在视图的另一行中正常工作
- PlayerCore是PlayerCore的数组,定义如下:
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)))
}
}
问题肯定在这里
func indexOfPlayerInScores(player: Player) -> Int {
return playerScores.firstIndex(where: {$0.player.id == player.id})!
}
您的Player
在构造函数中没有id
,因此它是自动生成的,所以上述方法在运行时无法找到匹配项,因为在预览中创建的Player和在Game
中默认添加的Player是不同的(与类型、类或结构无关)
解决方案:更改检测玩家相等的逻辑(可能明确确认为相等)。我在预览中没有遇到任何数组问题。你会显示游戏代码吗?添加游戏代码-谢谢@AsperiCould struct Player是可识别的,Hashable可能是个问题吗?谢谢。你的详细解释花了一段时间才理解,但我把它修好了。作为结构的一个参数,我最终从一个玩家变成了另一个玩家。这移动了playerScore元素和游戏中playerScore元素之间的相等性检查,从而解决了运行时错误。我不必遵守Equalable,但必须遵守Identification和hashable(针对PLayerScore)
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)))
}
}
func indexOfPlayerInScores(player: Player) -> Int {
return playerScores.firstIndex(where: {$0.player.id == player.id})!
}