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
相关产品推荐
相关产品推荐

