ios - SwiftUI 和 ScrollView:设备旋转后视图消失
问题描述
该视图由 SwiftUI 组成,List 包含几行,每行包含一个带有项目的 ScrollView。它类似于 Apple 的 SwiftUI Landmark 教程 ( https://developer.apple.com/tutorials/swiftui/composing-complex-interfaces )。当我旋转设备(在真正的 iPhone XS 上测试)时,ScrollView 的内容消失了。当我将 ScrollView 替换为另一个元素(例如 Text)时,此问题不存在。因此,这个问题一定与 ScrollView 的使用有关。请参阅下面的屏幕截图和 SwiftUI 代码。
行为
代码
struct ContentView: View {
@FetchRequest(
entity: InsigniaContainer.entity(),
sortDescriptors: [
NSSortDescriptor(keyPath: \InsigniaContainer.sort, ascending: true),
],
predicate: NSPredicate(format: "parentContainer == NULL")
) var insigniaContainers: FetchedResults<InsigniaContainer>
var body: some View {
NavigationView {
List {
ForEach(self.insigniaContainers, id: \.objectID) { (insigniaContainer: InsigniaContainer) in
ServiceBranchRow(serviceBranch: insigniaContainer)
}
.listRowInsets(EdgeInsets())
}
.navigationBarTitle("Armed Forces")
}
.navigationViewStyle(StackNavigationViewStyle())
}
}
struct ServiceBranchRow: View {
var serviceBranch: InsigniaContainer
var body: some View {
VStack(alignment: .leading, spacing: 0) {
Text(self.serviceBranch.wrappedName)
.font(.headline)
.fontWeight(.heavy)
.padding(.leading, 15)
.padding(.top, 10)
Spacer()
ScrollView(.horizontal, showsIndicators: false) {
HStack(spacing: 15) {
ForEach(self.serviceBranch.sortedChildContainers, id: \.objectID) { item in
NavigationLink(destination: InsigniaList(insigniaContainer: item)) {
ServiceBranchItem(item: item)
}
}
}
.padding(10)
.padding(.leading, 5)
.padding(.trailing, 5)
.padding(.bottom, 5)
}
}
}
}
解决方案
哦......那个问题......已知效果 - 这是由于列表缓存......它认为所有滚动视图都是相同的。
修复很简单 - 只需为滚动视图添加唯一 ID ,如下所示
ScrollView(.horizontal, showsIndicators: false) {
HStack(spacing: 15) {
ForEach(self.serviceBranch.sortedChildContainers, id: \.objectID) { item in
NavigationLink(destination: InsigniaList(insigniaContainer: item)) {
ServiceBranchItem(item: item)
}
}
}
.padding(10)
.padding(.leading, 5)
.padding(.trailing, 5)
.padding(.bottom, 5)
}
.id(UUID().uuidString) // !! here
推荐阅读
- kotlin - 有什么方法可以更改 Kotlin when 语句,以便更有效地包含枚举?
- mysql - 使用用户名而不是 id 从 2 个表中检索数据
- javascript - 替换组件WillMount()
- javascript - 使用正则表达式解析 Markdown 的子集
- bitbucket - bitbucket 是否将 git 归咎于类似于 github 的行功能?
- python - 支持 __getitem__ 的类的 Python 类型提示
- php - 找不到 PHP+Imagick 文件或路径是目录
- html - :visited on class 的问题。为什么 a:visited 工作正常,而 .myarticle:visited 不行?
- php - 显示带有关系的帖子评论 - Laravel
- javascript - React - 将表单数据写入文件