【问题标题】:Order my array content into grid [SwiftUI]将我的数组内容排序到网格中 [SwiftUI]
【发布时间】:2020-07-10 19:23:45
【问题描述】:

我需要将我的 Array 的内容显示到一个网格中(因此混合了 HStack 和 VStack)。我找到了这个资源:https://www.hackingwithswift.com/quick-start/swiftui/how-to-position-views-in-a-grid

如果您需要显示静态内容(在示例中为文本和图像),这将直接工作。

但是现在,我需要能够进行相同的显示,但使用数组的内容(没有大小限制,数组可以有 3 或 10 个项目)

所以需要转换我的实际代码:

ForEach(myarray.indices, id: \.self) { index in
    myView(Value: myitem[index].value, Type: myitem[index].type)
}

这样它就可以被包装成一个网格列表。

这一定很简单,但我是 SwiftUI 新手,我不知道该怎么做,我尝试调整链接中的代码但没有机会...

有什么想法吗? 谢谢!

【问题讨论】:

    标签: arrays layout foreach swiftui


    【解决方案1】:
    import SwiftUI
    
    struct GridStack<Content: View>: View {
        let rows: Int
        let columns: Int
        let content: (Int, Int) -> Content
        @State private var currentPosition: CGSize = .zero
        @State private var oldPosition: CGSize = .zero
        @State private var newPosition: CGSize = .zero
        @State private var buttonBackColor:Color = .white
        @State private var bgColorDict = [  0: "neutral", 1: "neutral", 2: "neutral", 3: "neutral", 4: "neutral",
                                     5: "neutral", 6: "neutral", 7: "neutral", 8: "neutral", 9: "neutral",
                                    10: "neutral", 11: "neutral", 12: "neutral", 13: "neutral", 14: "neutral",
                                    15: "neutral", 16: "neutral", 17: "neutral", 18: "neutral", 19: "neutral",
                                    20: "neutral", 21: "neutral", 22: "neutral", 23: "neutral", 24: "neutral",
                                    25: "neutral", 26: "neutral", 27: "neutral", 28: "neutral", 29: "neutral",
                                    30: "neutral", 31: "neutral", 32: "neutral", 33: "neutral", 34: "neutral",
                                    35: "neutral", 36: "neutral", 37: "neutral", 38: "neutral", 39: "neutral",
                                    40: "neutral", 41: "neutral", 42: "neutral", 43: "neutral", 44: "neutral",
                                    45: "neutral", 46: "neutral", 47: "neutral", 48: "neutral", 49: "neutral",
                                    50: "neutral", 51: "neutral", 52: "neutral", 53: "neutral", 54: "neutral",
                                    55: "neutral", 56: "neutral", 57: "neutral", 58: "neutral", 59: "neutral",
                                    60: "neutral", 61: "neutral", 62: "neutral", 63: "neutral", 64: "neutral",
                                    65: "neutral", 66: "neutral", 67: "neutral", 68: "neutral", 69: "neutral",
                                    70: "neutral", 71: "neutral", 72: "neutral", 73: "neutral", 74: "neutral",
                                    75: "neutral", 76: "neutral", 77: "neutral", 78: "neutral", 79: "neutral",
                                    80: "neutral", 81: "neutral", 82: "neutral", 83: "neutral", 84: "neutral",
                                    85: "neutral", 86: "neutral", 87: "neutral", 88: "neutral", 89: "neutral",
                                    90: "neutral", 91: "neutral", 92: "neutral", 93: "neutral", 94: "neutral",
                                    95: "neutral", 96: "neutral", 97: "neutral", 98: "neutral", 99: "neutral"
                                  ]
        let theSheet = ["t","r","c","g","T","M","B","G","s","v",
                        "N","U","e","p","A","D","f","C","H","a",
                        "y","P","F","d","b","r","j","n","I","x",
                        "i","m","S","O","o","u","E","L","h","k",
                        "N","j","r","b","x","e","u","A","H","o",
                        "p","S","L","n","k","M","U","s","g","P",
                        "i","m","T","D","a","f","I","B","h","v",
                        "E","G","d","y","R","F","t","c","C","O",
                        "o","r","m","k","h","v","t","p","c","e",
                        "g","d","b","s","i","f","a","u","n","y",]
    
        var body: some View {
            VStack {
                ForEach(0 ..< 1, id: \.self) { row in
                    HStack(spacing: 0) {
                        ForEach(0 ..< 1, id: \.self) { column in
                            Text(self.theSheet[(10 * row) +  column])
                                .font(.custom("Rockwell",size:24))
                                .frame(width: 30, height: 30, alignment: .center)
                                .padding()
                                .onTapGesture {
                                    if (self.bgColorDict[(row*10) + column] == "neutral") {
                                        self.bgColorDict[(row*10) + column] = "correct"
                                    } else if self.bgColorDict[(row*10) + column] == "correct" {
                                        self.bgColorDict[(row*10) + column] = "wrong"
                                    } else {
                                        self.bgColorDict[(row*10) + column] = "neutral"
                                    }
                                }
                                .background(Color(String(self.bgColorDict[(row*10) + column] ?? "neutral"))).border(Color.gray)
                        }
                    }
                }
            }
        }
    

    【讨论】:

    • 用您的数组替换 theSheet。您还可以将您的特定手势操作放在 .onTapGesture
    【解决方案2】:
    struct ContentView: View {
    
        let myArray = [
            [1, 2, 3],
            [4, 5, 6],
            [7, 8, 9]
        ]
    
        var body: some View {
    
            VStack {
                ForEach(myArray, id: \.self) { row in
                    HStack {
                        ForEach(row, id: \.self) { number in
                            Text(String(number))
                        }
                    }
                }
            }
        }
    }
    

    这是一个排列成简单网格的数组。

    【讨论】:

    • 但我需要传递“索引”才能对我点击的 myView() 执行特定操作。所以我的问题是如何自动分割我的数组每 3 个元素,以及如何编写我的 ForEach 来传递行、列和索引参数?
    • 您在阵列中存储了什么?例如,如果它是一个值为 1 到 99 的 int 数组。(让 myArray = Array(1...99) 我们可以将数组排序为 3 段,例如,这将为您提供 33 行 3 个 int。
    • 我用 2 个字符串值存储视图(像这样:myView(value: "string1", type: "string2"))
    猜你喜欢
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多