【问题标题】:SwiftUI - nested listSwiftUI - 嵌套列表
【发布时间】:2020-03-11 22:34:00
【问题描述】:

我正在尝试创建一个嵌套的分层列表,以便对于每个任务我都可以像在 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()
    }

但是,没有成功...

有人可以帮忙吗?

干杯

【问题讨论】:

    标签: xcode swiftui swiftui-list


    【解决方案1】:

    这并不难,但你必须手动添加一些框架。

            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")
                    }
                }
            }
    

    【讨论】:

    • 这可能有效。但我猜这肯定不是推荐的方式。
    【解决方案2】:

    为什么你认为它应该是 List in List... 这样的视觉表示可以只使用一个列表生成,并且具有原生的外观和感觉。

    这里只是一个演示(没有 UI 调整和显示/隐藏部分的逻辑,这超出了主题),但想法应该很清楚

    import SwiftUI
    
    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 TestNestedLists_Previews: PreviewProvider {
        static var previews: some View {
            TestNestedLists()
        }
    }
    

    【讨论】:

    【解决方案3】:

    将一个列表放在另一个列表中,就像这个小例子:

    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 解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多