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

SwiftUI列表单选实现:选中项isFavorite=true,其余重置为false

实现单选式收藏状态切换(同一时间仅一个Item为收藏状态)

要实现同一时间只有一个Item处于收藏状态,你可以通过以下两种方式修改代码:

方案一:直接修改数组元素状态

修改isFavoriteToggle函数,遍历数组将所有Item的isFavorite设为false,仅将当前选中的Item设为true:

func isFavoriteToggle(element: Items) {
    queryList = queryList.map { item in
        var updatedItem = item
        updatedItem.isFavorite = item.id == element.id
        return updatedItem
    }
}

完整修改后的ExampleList代码:

struct ExampleList: View {
    @State var queryList: [Items] = Items.samples

    func isFavoriteToggle(element: Items) {
        queryList = queryList.map { item in
            var updatedItem = item
            updatedItem.isFavorite = item.id == element.id
            return updatedItem
        }
    }
   
    var body: some View {
        NavigationStack {
            List {
                ForEach($queryList) { $list in
                    Button {
                        isFavoriteToggle(element: list)
                    } label: {
                        HStack {
                            Text(list.name)
                            Spacer()
                            Image(systemName: "star.fill")
                                .foregroundColor(list.isFavorite ? Color.yellow : Color.gray)
                        }
                    }
                }
            }
            .navigationTitle("Test")
            .listStyle(.plain)
            .padding()
        }
    }
}

方案二:用单独状态变量跟踪选中项(更高效)

新增一个状态变量记录当前选中的收藏项ID,无需修改数组内的isFavorite属性,直接通过ID判断选中状态:

struct ExampleList: View {
    @State var queryList: [Items] = Items.samples
    @State private var selectedFavoriteId: String?

    func isFavoriteToggle(element: Items) {
        selectedFavoriteId = element.id
    }
   
    var body: some View {
        NavigationStack {
            List {
                ForEach(queryList) { list in
                    Button {
                        isFavoriteToggle(element: list)
                    } label: {
                        HStack {
                            Text(list.name)
                            Spacer()
                            Image(systemName: "star.fill")
                                .foregroundColor(selectedFavoriteId == list.id ? Color.yellow : Color.gray)
                        }
                    }
                }
            }
            .navigationTitle("Test")
            .listStyle(.plain)
            .padding()
        }
    }
}

方案说明

  • 方案一保持了原有数据结构,直接修改数组内元素的状态,逻辑直观,适合数据量较小的列表。
  • 方案二通过单独的状态变量跟踪选中状态,避免了频繁修改数组,性能更优,尤其适合数据量大的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:05:28