SwiftUI - 嵌套列表
SwiftUI - nested list
我正在尝试创建一个嵌套的分层列表,这样对于每个任务我都可以有子任务,例如 iOS 提醒应用程序:
第一次尝试是在列表单元格中嵌入另一个列表。
import SwiftUI
struct SwiftUIView: View {
var body: some View {
List {
List {
Text("Hello, World!")
}
}
}
}
struct SwiftUIView_Previews: PreviewProvider {
static var previews: some View {
SwiftUIView()
}
但是,没有成功...
有人可以帮忙吗?
干杯
这并不难,但你必须手动添加一些框架。
struct SwiftUIViewList: View {
var body: some View {
List {
Text("Hello, World!")
Text("Hello, World!")
}
}
}
struct SwiftUIView: View {
var body: some View {
List {
Text("item1")
SwiftUIViewList().frame(height: 100)
Text("item3")
}
}
}
为什么你认为它应该是列表中的列表...这样的视觉表示可以只使用一个列表生成,并且它将具有原生的外观和感觉。
这里只是一个demo(w/o UI showing/hiding 段的调优和逻辑,那是题外话),但是思路应该很清晰
struct ItemRow: View {
let category: Bool
let text: String
init(_ text: String, isCategory: Bool = false) {
self.category = isCategory
self.text = text
}
var body: some View {
HStack {
Circle().stroke() // this can be custom control
.frame(width: 20, height: 20)
.onTapGesture {
// handle tap here
}
if category {
Text(self.text).bold()
} else {
Text(self.text)
}
}
}
}
struct TestNestedLists: View {
var body: some View {
List { // next pattern easily wrapped with ForEach
ItemRow("Category", isCategory: true) // this can be section's header
Section {
ItemRow("Item 1")
ItemRow("Item 2")
ItemRow("Item 3")
}.padding(.leading, 20)
}
}
}
将一个列表放在另一个列表中,就像这个小例子:
struct ContentView: View {
var body: some View {
List {
Text("External List")
List {
Text("Internal List")
}
}
}
}
结果如下:
Result Error
我测试发现,当内部列表的样式为任何分组样式(.grouped、.insetGrouped或新的.sidebar)时,就会出现错误。
相比之下,如果内部列表具有任何非分组样式(.inset 或 .plain),则它可以正常工作。
struct ContentView: View {
var body: some View {
List {
Text("External List")
List {
Text("Internal List")
}
.listStyle(.plain)
}
}
}
结果如下:
Result OK
除此之外,正如很多地方提到的,您不应该使用嵌套列表。您应该尝试使用 VStack 或 ForEach 来解决。
我正在尝试创建一个嵌套的分层列表,这样对于每个任务我都可以有子任务,例如 iOS 提醒应用程序:
第一次尝试是在列表单元格中嵌入另一个列表。
import SwiftUI
struct SwiftUIView: View {
var body: some View {
List {
List {
Text("Hello, World!")
}
}
}
}
struct SwiftUIView_Previews: PreviewProvider {
static var previews: some View {
SwiftUIView()
}
但是,没有成功...
有人可以帮忙吗?
干杯
这并不难,但你必须手动添加一些框架。
struct SwiftUIViewList: View {
var body: some View {
List {
Text("Hello, World!")
Text("Hello, World!")
}
}
}
struct SwiftUIView: View {
var body: some View {
List {
Text("item1")
SwiftUIViewList().frame(height: 100)
Text("item3")
}
}
}
为什么你认为它应该是列表中的列表...这样的视觉表示可以只使用一个列表生成,并且它将具有原生的外观和感觉。
这里只是一个demo(w/o UI showing/hiding 段的调优和逻辑,那是题外话),但是思路应该很清晰
struct ItemRow: View {
let category: Bool
let text: String
init(_ text: String, isCategory: Bool = false) {
self.category = isCategory
self.text = text
}
var body: some View {
HStack {
Circle().stroke() // this can be custom control
.frame(width: 20, height: 20)
.onTapGesture {
// handle tap here
}
if category {
Text(self.text).bold()
} else {
Text(self.text)
}
}
}
}
struct TestNestedLists: View {
var body: some View {
List { // next pattern easily wrapped with ForEach
ItemRow("Category", isCategory: true) // this can be section's header
Section {
ItemRow("Item 1")
ItemRow("Item 2")
ItemRow("Item 3")
}.padding(.leading, 20)
}
}
}
将一个列表放在另一个列表中,就像这个小例子:
struct ContentView: View {
var body: some View {
List {
Text("External List")
List {
Text("Internal List")
}
}
}
}
结果如下: Result Error
我测试发现,当内部列表的样式为任何分组样式(.grouped、.insetGrouped或新的.sidebar)时,就会出现错误。
相比之下,如果内部列表具有任何非分组样式(.inset 或 .plain),则它可以正常工作。
struct ContentView: View {
var body: some View {
List {
Text("External List")
List {
Text("Internal List")
}
.listStyle(.plain)
}
}
}
结果如下: Result OK
除此之外,正如很多地方提到的,您不应该使用嵌套列表。您应该尝试使用 VStack 或 ForEach 来解决。