【问题标题】:SwiftUI and ScrollView: Views Disappear After Device RotationSwiftUI 和 ScrollView:设备旋转后视图消失
【发布时间】:2023-03-24 17:05:02
【问题描述】:

视图由 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)
            }
        }
    }
}

【问题讨论】:

  • 我没有 iPhone XS,在模拟器上可以重现吗?
  • @Asperi 是的,它也可以在模拟器上重现。
  • 然后,我想,原点在您的自定义子视图中,因为我在提供的快照中将它们替换为 160x100 尺寸的Rectangle() 并使用 iPhone X 模拟器(Xcode 11.2 / iOS 13.2),一切正常。
  • 将 ScrollView 的全部内容,即 HStack 替换为 Rectangle().frame(width: 230.0, height: 150.0),但没有任何变化。
  • 你忘记了太空部队。

标签: ios swift swiftui


【解决方案1】:

哦...那个问题...已知效果 - 这是由于列表缓存...它认为所有滚动视图都是相同的。

修复很简单 - 只需为滚动视图添加唯一 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

【讨论】:

  • 非常感谢@Asperi,拯救了我的一天。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多