swiftui - SwiftUI 视图不更新
问题描述
由于下载图像的异步下载任务(内部),CardView
内部的ForEach
内容正确更新,并且正确显示,但我检测到周围的框架没有相应更新,导致出现在中间图像,而不是在正确更新的情况下被框架向下推,以包围图像。帮助我得出结论,因为它看起来好像是空的。请问有什么建议吗?CardNavigatorView
CardView
Image()
CardView
CardNavigatorView
Text("test")
CardView
CardView
border(Color.red, width:2)
struct CardNavigatorView: View {
@ObservedObject var model: CardNavigatorViewModel
@State private var offset: CGFloat = 0
let spacing: CGFloat = 10
var body: some View {
GeometryReader { geometry in
return ScrollView(.horizontal, showsIndicators: true) {
HStack(spacing: self.spacing) {
ForEach(self.model.cardSource.cards, id:\.hashString) { card in
CardView(card: card)
.frame(width: geometry.size.width).border(Color.red, width: 2)
}
}
}
.content.offset(x: self.offset)
.frame(width: geometry.size.width, alignment: .leading)
}
Text("Test")
}
}
CardView 声明如下
struct CardView: View {
@ObservedObject var card: Card
@EnvironmentObject var userData: UserData
var body: some View {
GeometryReader { geometry in
VStack {
ZStack(alignment: .topTrailing) {
ImageViewContainer(imageUrl: self.card.imagesURL[0])
.frame(width:geometry.size.width)
.scaledToFill()
.clipped()
NameView(name: self.card.name)
.frame(width:geometry.size.width)
Button(action:{
self.userData.toggleFav(card:self.card)
}) {
ZStack{ Image("fav_icon").renderingMode(Image.TemplateRenderingMode?.init(Image.TemplateRenderingMode.original))
.resizable()
.aspectRatio(contentMode:.fit)
.frame(width:25).opacity(self.card.isFav ? 1 : 0).offset(x:-10, y:10)
Image("not_fav_icon").renderingMode(Image.TemplateRenderingMode?.init(Image.TemplateRenderingMode.original))
.resizable()
.aspectRatio(contentMode:.fit)
.frame(width:25).opacity(self.card.isFav ? 0 : 1).offset(x:-10, y:10)
}
}
}.border(Color.green, width: 3)
Text("\(self.card.description)")
Text("Note : \(self.card.ratingString)")
}.onAppear{self.userData.setUserSettingsTo(card: self.card)}
}
}
}
解决方案
找到解决方案。对于想知道出了什么问题的人:我猜GeometryReader
inCardView
获得了ScrollView
parent的大小,而 parentCardNavigatorView
又被认为是空的。由于GeometryReader
闭包允许扩展到其边界之外,我得到了我试图解释的效果。frame(width:geometry.size.width)
提示是为CardView 实例提供修饰符!(根据您的需要进行调整)
推荐阅读
- c# - C# 和 Python 之间的通信
- javascript - Web api中的RoutePrefix不启动控制器
- angular - 访问angularfire2中的另一个firestore数据
- java - 未知来源 Java 10
- plsql - 如何要求用户输入另一个值,直到用户在 plsql 中仅输入正数
- python - 带有计数器的python中的for循环?
- c++ - 在构造函数中初始化成员时,是否应该对成员使用 std::move?
- html - 页脚不会填满页面的整个宽度
- r - R:如何根据频率为我的网络创建权重?
- html - 上传时如何在 GitHub 自述文件中保留 HTML 格式?