SwiftUI未更新子视图中的ObservedObject
所以我试着从斯坦福CS193p学习SwiftUI。这很有效,但是,我无法理解为什么这不起作用。我与讲师的观点完全相同: 结构ContentView:View{ @观察对象变量视图模型:EmojiMemoryGame var body:一些观点{ HStack{ ForEachself.viewModel.cards{card in CardViewcard:card.ontaps{ self.viewModel.chooseCardcard:card } } .aspectRatio2/3,内容模式:。适合 } .橙色 衬料 .fontviewModel.numberOfPairsOfCards>=5?.callout:.LarGetTitle } } 结构卡视图:视图{ 变量卡:MemoryGame.card var body:一些观点{ VStack{ ZStack{ 如果card.isFaceUp{ RoundedRectanglecornerRadius:10.0.fillColor.white 圆角直角角半径:10.0。频闪线宽度:3 Textcard.content }否则{ RoundedRectanglecornerRadius:10.0.fillColor.orange } } } } } 问题在于,这不会更新视图,就好像模型中发布的信息不会传递到层次结构中一样。我知道它是有效的,因为如果我将代码更改为: 结构ContentView:View{ @观察对象变量视图模型:EmojiMemoryGame var body:一些观点{ HStack{ ForEachself.viewModel.cards{card in ZStack{ 如果card.isFaceUp{ RoundedRectanglecornerRadius:10.0.fillColor.white 圆角直角角半径:10.0。频闪线宽度:3 Textcard.content }否则{ RoundedRectanglecornerRadius:10.0.fillColor.orange } } .ontapsigne{ self.viewModel.chooseCardcard:card } } .aspectRatio2/3,内容模式:。适合 } .橙色 衬料 .fontviewModel.numberOfPairsOfCards>=5?.callout:.LarGetTitle } } 一切都很好。 非常感谢您的帮助 类emojiMemoryName:ObservableObject{ @已发布的私有var游戏:MemoryGame=EmojiMemoryGame.createMemoryGame 静态私有函数createMemoryGame->MemoryGame{SwiftUI未更新子视图中的ObservedObject,swift,swiftui,Swift,Swiftui,所以我试着从斯坦福CS193p学习SwiftUI。这很有效,但是,我无法理解为什么这不起作用。我与讲师的观点完全相同: 结构ContentView:View{ @观察对象变量视图模型:EmojiMemoryGame var body:一些观点{ HStack{ ForEachself.viewModel.cards{card in CardViewcard:card.ontaps{ self.viewModel.chooseCardcard:card } } .aspectRatio2/3,内容
让emojis=[在您的卡结构中实现相等运算符只比较ID。不会更新CardView,因为SwiftUI推断卡没有更改 请注意,您可能需要检查卡的其他属性以及CardContent是否需要符合Equatable
struct Card: Identifiable, Equatable {
static func == (lhs: MemoryGame<CardContent>.Card, rhs: MemoryGame<CardContent>.Card) -> Bool {
return lhs.id == rhs.id && lhs.isFaceUp == rhs.isFaceUp
}
var isFaceUp = true
var isMatched = false
var content: CardContent
var id: Int
}
提供的代码快照不可测试。是否提供缺少的部分?添加了EmojiMemoryGame和MemoryGame。问题似乎出现在卡模型中。具有相同“id”但面不同的卡根据==运算符相等,因此不会更新。如果我更新比较函数以包含“isFaceUp”,则代码看起来很有效。