SwiftUI列表不显示任何项目。

23

我想要在ScrollView中使用NavigationView,但是我没有看到列表项。

struct ContentView: View {
    var body: some View {
        NavigationView {
            ScrollView{
                VStack {
                    Text("Some stuff 1")
                    List{
                        Text("one").padding()
                        Text("two").padding()
                        Text("three").padding()
                    }
                    Text("Some stuff 2")
                }
            }
        }
    }
}

我看到的只有文本。如果我移除ScrollView,我可以看到所有内容,但是文本会被推到页面底部。我希望能够在一个可滚动的页面中添加列表和视图。


为什么不使用VStack而不是List,它已经在ScrollView中了呢? - Asperi
3
我想要能够动态使用列表(List),列表(array) { item in ... - Winten
2
我猜在ScrollView中包装一个List可能不是一个好主意,因为滚动处理程序之间可能会发生冲突。 - Oscar Franco
2个回答

51

ScrollView需要从内容中获取尺寸信息,但List需要从容器中获取尺寸信息 - 因此存在冲突。 对于列表的大小是未定义的,因此渲染引擎会丢弃它以避免歧义。

解决方案是为List定义一些大小,具体取决于您的需求,这样ScrollView就知道如何布局它,从而可以滚动整个内容并且列表可以滚动内部内容。

例如:

demo

struct ContentView: View {
    @Environment(\.defaultMinListRowHeight) var minRowHeight

    var body: some View {
        NavigationView {
            ScrollView{
                VStack {
                    Text("Some stuff 1")
                    List {
                        Text("one").padding()
                        Text("two").padding()
                        Text("three").padding()
                    }.frame(minHeight: minRowHeight * 3).border(Color.red)
                    Text("Some stuff 2")
                }
            }
        }
    }
}

1
谢谢!!它正在工作,但我有动态高度,所以无法固定 minHeight。如果我固定它,将会显示额外的滚动条或者我的内容将被截断。有什么建议吗? - Hardik Shah
真是太愚蠢了,他们居然没有设置最小尺寸或其他方式来让开发人员知道列表确实存在。谢谢提供这个信息! - Stu P.

2

我想提供一个解决方案,它可以修复类似于原始问题的问题。我在我的List{ ... }部分之前放置了一个Label()项,当我删除了那个Label() { }时,我能够再次看到我的List内容。可能是由于其他项目与List周围存在缺陷(Xcode 13 Beta 5)。


1
我同意。我曾经尝试过在ScrollView中放置List,但它从未按预期工作。如果您选择使用ScrollView,请实现自己的列表项。 - christostsang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接