使用 ForEach (SwiftUI) 的偶数行和奇数行

Posted

技术标签:

【中文标题】使用 ForEach (SwiftUI) 的偶数行和奇数行【英文标题】:Even and Odd rows using ForEach (SwiftUI) 【发布时间】:2020-03-03 00:47:00 【问题描述】:

在 ForEach 循环中区分偶数行和奇数行的最佳方法是什么?循环的内容不是数字(即用户结构),它可以使用搜索短语进行过滤(我认为仅使用数组中的项目索引不适用于这种方式)。我需要更改那些行的颜色。

【问题讨论】:

【参考方案1】:

如果我正确理解问题,您可以使用数据数组的索引并检查奇数行的条件index % 2 == 1(因为索引从 0 开始)。对于过滤后的数据,我建议计算值:

import SwiftUI
import Combine

struct HighlightingRowData: Identifiable 
    let id = UUID()
    let title: String


final class SomeData: ObservableObject 
    @Published var data: [HighlightingRowData] = [HighlightingRowData(title: "R. Martin"), HighlightingRowData(title: "McConell"), HighlightingRowData(title: "London"), HighlightingRowData(title: "London")]


struct HighlitedRowsInList: View 

    @EnvironmentObject var someData: SomeData
    @State private var searchedText = ""
    private var filteredData: [HighlightingRowData] 
        return searchedText == "" ? someData.data : someData.data.filter  $0.title.contains(searchedText) 
    

    var body: some View 

        List 

            TextField("filter", text: $searchedText)

            ForEach(filteredData.indices, id: \.self)  rowIndex in
                HStack 
                    Text(self.filteredData[rowIndex].title)
                    Spacer()
                
                    .background(rowIndex % 2 == 1 ? Color.yellow : Color.clear)
            

        
    


struct HighlitedRowsInList_Previews: PreviewProvider 
    static var previews: some View 
        HighlitedRowsInList()
            .environmentObject(SomeData())
    


您可以使用以下代码实现类似的功能:

【讨论】:

以上是关于使用 ForEach (SwiftUI) 的偶数行和奇数行的主要内容,如果未能解决你的问题,请参考以下文章

Swiftui 如何在 foreach 循环中对整行使用 Tap Gesture

swiftui删除核心数据行

如果列表行在 SwiftUI 中包含文本字段,则无法从 foreach 中删除元素

SwiftUI list 移动和选择行

SwiftUI:删除 ForEach 中的最后一行

SwiftUI:删除 ForEach 中的最后一行