You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI List如何添加索引实现交替背景色(系统/自定义颜色)

在SwiftUI List中实现交替背景色(含绑定数据的ForEach)

需求:在SwiftUI List里给行添加交替背景色,现有代码用ForEach($listViewModel.items)绑定数据渲染行,需要参考示例中通过索引实现交替色的方式,但不知道怎么给带绑定的ForEach添加索引。

现有代码:

import SwiftUI

struct FriendshipListView: View {
    
    @EnvironmentObject var listViewModel: MenuListFriendshipViewModel
    
    var body: some View {
        NavigationView {
            List {
                //Use the $ syntax to pass a binding on to the subviews
                ForEach($listViewModel.items) { $item in
                    MenuListRowView(item: $item)
                }
            }
            .navigationBarTitle(Text("Friendships / Relationships"))
            .listStyle(PlainListStyle())
        }
    }
}

struct ListView_Previews: PreviewProvider {
    static var previews: some View {
        FriendshipListView()
        .environmentObject(MenuListFriendshipViewModel())
    }
}

参考示例代码:

List {
    ForEach(items.indices) { index in
        Text(items[index])
            .listRowBackground((index  % 2 == 0) ? Color(.systemBlue) : Color(.white))
    }
}

解决方案

要给带绑定的ForEach添加索引并实现交替背景色,这里有两种可行的实现方式:

方法1:通过enumerated()创建自定义绑定

遍历数组的同时拿到索引,手动构建绑定传递给子视图:

import SwiftUI

struct FriendshipListView: View {
    
    @EnvironmentObject var listViewModel: MenuListFriendshipViewModel
    
    var body: some View {
        NavigationView {
            List {
                // 用enumerated()同时获取索引和元素,id绑定到element的id(需元素符合Identifiable)
                ForEach(Array(listViewModel.items.enumerated()), id: \.element.id) { index, _ in
                    // 手动创建绑定,通过索引读写数组元素
                    let itemBinding = Binding(
                        get: { listViewModel.items[index] },
                        set: { listViewModel.items[index] = $0 }
                    )
                    
                    MenuListRowView(item: itemBinding)
                        // 根据索引奇偶设置背景色
                        .listRowBackground(index % 2 == 0 ? Color(.systemGray6) : Color(.white))
                }
            }
            .navigationBarTitle(Text("Friendships / Relationships"))
            .listStyle(PlainListStyle())
        }
    }
}

方法2:直接遍历数组索引获取绑定

如果你的数组元素已经遵循Identifiable协议,可以直接遍历索引,通过索引获取绑定:

import SwiftUI

struct FriendshipListView: View {
    
    @EnvironmentObject var listViewModel: MenuListFriendshipViewModel
    
    var body: some View {
        NavigationView {
            List {
                // 遍历数组索引,id用.self标识
                ForEach(listViewModel.items.indices, id: \.self) { index in
                    // 通过$listViewModel.items[index]直接获取绑定
                    MenuListRowView(item: $listViewModel.items[index])
                        .listRowBackground(index % 2 == 0 ? Color(.systemGray6) : Color(.white))
                }
            }
            .navigationBarTitle(Text("Friendships / Relationships"))
            .listStyle(PlainListStyle())
        }
    }
}

注意事项

  • 两种方法都能通过index % 2 == 0区分奇偶行,你可以替换示例中的颜色为任意系统颜色或自定义颜色
  • 确保MenuListFriendshipViewModel中的items是@Published修饰的可变数组,这样绑定才能正常工作
  • 如果元素未遵循Identifiable,方法1中需要把id: \.element.id替换为元素的唯一标识属性,或者使用ForEach的带id参数的重载

内容的提问来源于stack exchange,提问作者Kraig Kistler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:20:31