SwiftUI 列表子视图未显示
SwiftUI List subview not showing up
我试图嵌入一个包含 Header 视图和列表 header 的视图,并在原始视图中呈现列表,但是当我将其放入parent 查看。我不明白我做错了什么。我尝试将 header 放入列表中,但随后整个视图都消失了。
这是包含列表的视图的代码:
import SwiftUI
struct CityDetailCategoryView: View {
let cityDetailViewModel: CityDetailViewModel
let titles = ["Category 2", "Category 3", "Category 4", "Category 5", "Category 6", "Category 7"]
var body: some View {
VStack(alignment: .leading) {
SectionHeadingView(cityDetailViewModel: CityDetailViewModel, sectionTitle: "Categories")
List {
ForEach(titles, id: \.self) { title in
Text(title)
.font(.title3)
.fontWeight(.medium)
}
}
}
}
}
struct CityDetailCategoryView_Previews: PreviewProvider {
static var previews: some View {
CityDetailCategoryView(cityDetailViewModel: CityDetailViewModel())
.previewLayout(.sizeThatFits)
}
}
...以及 parent 视图的代码:
import SwiftUI
struct CityDetailView: View {
@ObservedObject var cityDetailViewModel: CityDetailViewModel
var body: some View {
NavigationView {
ScrollView(.vertical, showsIndicators: false, content: {
VStack(alignment: .leading, spacing: 6, content: {
DetailHeaderImageView(cityDetailViewModel: CityDetailViewModel)
Group {
CityDetailTitleView(cityDetailViewModel: CityDetailViewModel)
CityDetailQuickFactsView(cityDetailViewModel: CityDetailViewModel)
CityDetailCategoryView(cityDetailViewModel: CityDetailViewModel)
CityDetailMiscellaneousView(cityDetailViewModel: CityDetailViewModel)
HStack {
Spacer()
Text("Data provided by ****")
.font(.caption2)
Spacer()
}
.padding()
}
.padding(.horizontal, 24)
})
})
.edgesIgnoringSafeArea(.top)
.navigationBarTitle(cityDetailViewModel.cityDetail.name, displayMode: .inline)
.navigationBarHidden(true)
}
}
}
struct CityDetailView_Previews: PreviewProvider {
static var previews: some View {
CityDetailView(cityDetailViewModel: CityDetailViewModel())
}
}
包含列表的视图图像:
parent 视图的图像:
您正在将一个滚动视图 (List
) 嵌入到另一个滚动视图 (ScrollView
) 中,这总是会有一些固有的困难(并且可能会产生奇怪的 UI/UX 后果滚动)。
因为 CityDetailCategoryView
除了它的 header 之外没有任何固有高度(其余的可以折叠成 ScrollView
),所以它折叠为零。
您可以使用 frame
为其设置高度,如这个简化示例所示(如果您删除 frame
调用,它的行为与您的相同):
var items = [1,2,3,4,5,6]
struct ContentView: View {
var body: some View {
ScrollView {
ForEach(items, id: \.self) { item in
Text("item")
}
List {
ForEach(items, id: \.self) { item in
Text("item")
}
}.frame(height: 200) //<-- here
Text("last item")
}
}
}
话虽这么说,我认为您仍然会 运行 滑稽滚动行为的风险。
我的建议是重新构建您的视图,以便您拥有 一个 列表或滚动视图来显示所有内容。
我试图嵌入一个包含 Header 视图和列表 header 的视图,并在原始视图中呈现列表,但是当我将其放入parent 查看。我不明白我做错了什么。我尝试将 header 放入列表中,但随后整个视图都消失了。
这是包含列表的视图的代码:
import SwiftUI
struct CityDetailCategoryView: View {
let cityDetailViewModel: CityDetailViewModel
let titles = ["Category 2", "Category 3", "Category 4", "Category 5", "Category 6", "Category 7"]
var body: some View {
VStack(alignment: .leading) {
SectionHeadingView(cityDetailViewModel: CityDetailViewModel, sectionTitle: "Categories")
List {
ForEach(titles, id: \.self) { title in
Text(title)
.font(.title3)
.fontWeight(.medium)
}
}
}
}
}
struct CityDetailCategoryView_Previews: PreviewProvider {
static var previews: some View {
CityDetailCategoryView(cityDetailViewModel: CityDetailViewModel())
.previewLayout(.sizeThatFits)
}
}
...以及 parent 视图的代码:
import SwiftUI
struct CityDetailView: View {
@ObservedObject var cityDetailViewModel: CityDetailViewModel
var body: some View {
NavigationView {
ScrollView(.vertical, showsIndicators: false, content: {
VStack(alignment: .leading, spacing: 6, content: {
DetailHeaderImageView(cityDetailViewModel: CityDetailViewModel)
Group {
CityDetailTitleView(cityDetailViewModel: CityDetailViewModel)
CityDetailQuickFactsView(cityDetailViewModel: CityDetailViewModel)
CityDetailCategoryView(cityDetailViewModel: CityDetailViewModel)
CityDetailMiscellaneousView(cityDetailViewModel: CityDetailViewModel)
HStack {
Spacer()
Text("Data provided by ****")
.font(.caption2)
Spacer()
}
.padding()
}
.padding(.horizontal, 24)
})
})
.edgesIgnoringSafeArea(.top)
.navigationBarTitle(cityDetailViewModel.cityDetail.name, displayMode: .inline)
.navigationBarHidden(true)
}
}
}
struct CityDetailView_Previews: PreviewProvider {
static var previews: some View {
CityDetailView(cityDetailViewModel: CityDetailViewModel())
}
}
包含列表的视图图像:
parent 视图的图像:
您正在将一个滚动视图 (List
) 嵌入到另一个滚动视图 (ScrollView
) 中,这总是会有一些固有的困难(并且可能会产生奇怪的 UI/UX 后果滚动)。
因为 CityDetailCategoryView
除了它的 header 之外没有任何固有高度(其余的可以折叠成 ScrollView
),所以它折叠为零。
您可以使用 frame
为其设置高度,如这个简化示例所示(如果您删除 frame
调用,它的行为与您的相同):
var items = [1,2,3,4,5,6]
struct ContentView: View {
var body: some View {
ScrollView {
ForEach(items, id: \.self) { item in
Text("item")
}
List {
ForEach(items, id: \.self) { item in
Text("item")
}
}.frame(height: 200) //<-- here
Text("last item")
}
}
}
话虽这么说,我认为您仍然会 运行 滑稽滚动行为的风险。
我的建议是重新构建您的视图,以便您拥有 一个 列表或滚动视图来显示所有内容。