【问题标题】:SwiftUI - ForEach with StrideSwiftUI - ForEach 与 Stride
【发布时间】:2020-04-20 06:24:04
【问题描述】:

我试图创建一个 Hstack'd 卡片列表,也就是说,我想创建一系列行的滚动视图。每行将包含并排显示的两个视图的 HStack,并由一些列表数据结构初始化。

struct MyHStackView: View { 

    var myArray = [SomeStruct(1), SomeStruct(3), SomeStruct(4), SomeStruct(5), SomeStruct(6)]

    var body: some View {
        ScrollView(.vertical) { 
            VStack { 
                ForEach(0..<self.myArray.count) { index in 
                    HStack { 
                        SubView(myArray[index])
                        SubView(myArray[index+1]) 
            }
        } 
    }
} 

唯一的问题是我当前的实现涉及数组的每个元素,是否有一个 stride 函数内置到新的 ForEach 中,以便我可以索引数组上的每个其他元素来初始化行?你会如何处理这个问题?

【问题讨论】:

    标签: swiftui ios13 xcode11


    【解决方案1】:

    对于简单的用例,E. Coms 发布的解决方案可能有效。如果您打算修改或重新排序列表,则可能会给您带来麻烦,因为指定的 id 与索引相同,并且 List 将无法正确地为删除/添加/重新排序设置动画。

    我会创建一个数据结构来以可识别的方式表示元组:

    struct SomeStructTouple: Identifiable {
      let a: SomeStruct
      let b: SomeStruct
    
      var id: String {
        "\(a.id)-\(b.id)"
      }
    }
    

    然后创建一个 touples 数组来生成列表。

    【讨论】:

      【解决方案2】:

      如果只是其他的,你可以试试

        VStack { 
                  ForEach(0 ..< self.myArray.count/2) { index in 
                      HStack { 
                          SubView(myArray[index * 2])
                          SubView(myArray[index * 2 + 1]) 
              }
      

      否则,您可能需要使用stride函数:

          ForEach( Array(stride(from: 0, to: self.myArray.count, by: 2)), id: \.self) { index in
      

      【讨论】:

      • 啊,这太完美了!我没有意识到我可以这样称呼 ForEach 内部的步幅。谢谢!
      • 作为一个实验,我将它粘贴到一个视图中:ForEach (Array(arrayLiteral: stride(from: 20, to: 50, by: 10)), id: \.self) {index in EmptyView()}(编译器需要 arrayLiteral:),现在我得到关于“ForEach”的编译错误要求“StrideTo”符合'可哈希'。这似乎等同于上面的内容 - 你能看出我哪里出错了吗?
      猜你喜欢
      • 2021-10-28
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      相关资源
      最近更新 更多