SwiftUI:应该如何制定ForEach视图以将字符串从数组转换为Text()视图?

时间:2020-03-25 17:40:27

标签: swift foreach swiftui

我在设法使用SwiftUI的ForEach视图中工作未果。通过跟踪诸如thisthisthis之类的资源,在我看来,给出了一个字符串数组:

var arrayOfStrings: [String] = ["String1", "String2", "String3"]

...以下每个实现均应起作用:

ForEach(arrayOfStrings, id: \.self) {
    Text(arrayOfStrings[$0])
}

ForEach(1...arrayOfStrings.count, id: \.self) {
    Text(arrayOfStrings[$0])
}

ForEach(arrayOfStrings, id: \.self) { string in
    Text(string)
}

但是它们每个都给我一个编译时错误,或者在运行时使应用程序崩溃。

以上只是示例代码,但是如果您需要我尝试执行的操作的完整上下文,则为:

struct Infobox<Content>: View where Content: View {
    let edgeSize: CGFloat = 8
    let color: Color = .neoblå
    let content: Content

    var body: some View {
        VStack(spacing: 0) {
            BoxSide(.top, withColor: color)
                .frame(height: edgeSize)
                .padding(.horizontal, 0)

            content
                .background(color)

            BoxSide(.bottom, withColor: color)
                .frame(height: edgeSize)
                .padding(.horizontal, 0)
        }
    }

    init(@ViewBuilder _ content: @escaping () -> Content) {
        self.content = content()
    }

    init<T: View>(withHeader headerText: String, forContentArray contentArray: [(text: String, value: String)], splitInTwoColumns twoColumns: Bool, @ViewBuilder ignoreTheClosure: @escaping () -> T) where Content == VStack<TupleView<(HStack<TupleView<(Spacer, Text, Spacer)>>, HStack<TupleView<(VStack<ForEach<ClosedRange<Int>, Int, Text>>, VStack<ForEach<ClosedRange<Int>, Int, Text>>, Spacer, VStack<ForEach<ClosedRange<Int>, Int, Text>>, VStack<ForEach<ClosedRange<Int>, Int, Text>>)>>)>> {

        var column1: [String] = []
        var column2: [String] = []
        var column3: [String] = []
        var column4: [String] = []

        let halfArray = contentArray.count/2
        for (index, content) in contentArray.enumerated() {
            if index+1 <= halfArray {
                column1.append(content.text)
                column2.append(content.value)
            } else {
                column3.append(content.text)
                column4.append(content.value)
            }
        }

        self.init() {

            VStack(alignment: .leading) {
                HStack() {
                    Spacer()
                    Text(headerText)
                        .font(.headline)
                    Spacer()
                }
                HStack {
                    VStack {
                        ForEach(column1, id: \.self) {
                            Text(column1[$0])
                        }
                    }
                    VStack {
                        ForEach(column2, id: \.self) {
                            Text(column2[$0])
                        }
                    }
                    Spacer()
                    VStack {
                        ForEach(column3, id: \.self) {
                            Text(column3[$0])
                        }
                    }
                    VStack {
                        ForEach(column4, id: \.self) {
                            Text(column4[$0])
                        }
                    }
                }
            }
        }
    }
}

摘要:给定一个(String,String)数组,创建一个由Text()元素组成的Infobox(),该元素分为四列(两列为“键”,两列为对应的值)

如果有人对如何修复这些ForEach视图有任何想法,我给您一个cookie:)

2 个答案:

答案 0 :(得分:0)

此操作失败,因为$0String,并且您无法使用字符串索引字符串数组

ForEach(arrayOfStrings, id: \.self) {
    Text(arrayOfStrings[$0])
}

此操作失败,因为数组索引从0开始->选择0的基本范围:0..<arrayOfStrings.count以避免出现“索引越界异常”

ForEach(1...arrayOfStrings.count, id: \.self) {
    Text(arrayOfStrings[$0])
}

这通常是正确的,但是当您的作用域为闭包时,您可能必须引用您成员资格限定的self.arrayOfStrings,这适用于所有SwiftUI代码:

ForEach(arrayOfStrings, id: \.self) { string in
    Text(string)
}

这是通过索引进行数组访问的更快捷的方法:

ForEach(arrayOfStrings.indices) {
  Text(self.arrayOfStrings[$0])
}

答案 1 :(得分:0)

一个简单的问题是您使用ForEach而不是说列表的原因吗?只是好奇。