滚动视图中的内容作为列表项在滚动(swiftui)时消失,为啥?

Posted

技术标签:

【中文标题】滚动视图中的内容作为列表项在滚动(swiftui)时消失,为啥?【英文标题】:Content in scrollview as a list item disappears when scrolling (swiftui), why?滚动视图中的内容作为列表项在滚动(swiftui)时消失,为什么? 【发布时间】:2020-01-19 14:20:43 【问题描述】:

@Asperi 的解决方案,ScrollView().id(UUID().uuidString)。

列表项中有一个scrollview,当我滚动列表时,scrollview中的内容消失了。

我认为问题在于滚动视图和列表可重用项目冲突。

如果我删除滚动视图(只是 hstack),什么都不会消失。所以我认为这是滚动视图的问题。有什么理想吗?

struct ContentView: View 
    var body: some View 
        List 
            ForEach(0...100, id: \.self)  _ in
                ItemView().padding()
            
        
    


struct ItemView: View 
    var body: some View 
        VStack(alignment: .leading) 
            Text("Tag list:")
            ScrollView(.horizontal, showsIndicators: false) 
                HStack 
                    ForEach(0...8, id: \.self)  _ in
                        TagView1()
                    
                
            .id(UUID().uuidString) /// <- fix
        
    


struct TagView1: View 
    var body: some View 
        Text("Tag\(String(UUID().uuidString.prefix(5)))")
            .foregroundColor(.secondary)
            .padding(.horizontal, 2)
            .background(RoundedRectangle(cornerRadius: 4).stroke(Color.secondary.opacity(0.5)))
            .padding(1)
    

【问题讨论】:

【参考方案1】:

如果我正确理解了消失的内容(我假设您的意思是垂直滚动时的列表行),那么是的,这是由于 List 重用/缓存优化问题。

以下方法应该可以工作(使用 Xcode 11.2 / ios 13.2 测试)

struct ItemView: View 
    var body: some View 
        VStack 
            Text("Tag list:")
            ScrollView(.horizontal, showsIndicators: false) 
                HStack 
                    ForEach(0...8, id: \.self)  _ in
                        TagView().padding()
                    
                
            .id(UUID().uuidString) // << here is a fix !
        
    

【讨论】:

我修改了帖子。 容器必须是list,不能是VStack。 ScrollView().id(UUID().uuidString) 是关键分辨率,感谢@Asperi。

以上是关于滚动视图中的内容作为列表项在滚动(swiftui)时消失,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:如何让滚动视图包含完整列表长度

如何使 SwiftUI 滚动视图缩小到内容?

SwiftUI 滚动/列表滚动事件

SwiftUI List 在任何视图更改时重置滚动

如何防止 TextEditor 在 SwiftUI 中滚动?

对 SwiftUI 中水平滚动视图内的列表不起作用的操作