iOS 16.x下SwiftUI List选中取消选中时崩溃问题咨询
iOS 16.x SwiftUI List 选中操作崩溃问题分析与解决
这是iOS 16.x版本SwiftUI框架的已知bug,根源在于更新数据源后,List内部的选中状态管理出现不一致,导致后续选中剩余行时触发状态异常崩溃。
可行解决办法
方法1:强制重建List清除残留状态
通过给List绑定动态ID,在数据源更新时重置ID,让List完全重建,彻底清理内部残留的选中状态缓存:
import SwiftUI struct New: View { @State var listItems: [String] = ["1", "2", "3", "4", "5"] @State var selection: String? @State private var listId = UUID() // 用于标识List的唯一ID var body: some View { VStack { Button("Update") { updateDataSource() } List(selection: $selection) { ForEach(listItems, id: \.self) { item in Text(item) } } .id(listId) // 将ID绑定到List } .padding() } func updateDataSource() { selection = nil listItems = ["1"] listId = UUID() // 更新ID,触发List重建 } }
方法2:同步选中状态与数据源
监听数据源变化,确保选中状态始终对应数据源中存在的项,避免无效状态残留:
import SwiftUI struct New: View { @State var listItems: [String] = ["1", "2", "3", "4", "5"] @State var selection: String? var body: some View { VStack { Button("Update") { updateDataSource() } List(selection: $selection) { ForEach(listItems, id: \.self) { item in Text(item) } } .onChange(of: listItems) { newItems in // 如果当前选中项不在新数据源中,重置选中状态 if let selected = selection, !newItems.contains(selected) { selection = nil } } } .padding() } func updateDataSource() { listItems = ["1"] } }
原理说明
iOS 16的List组件在移除已选中的列表项后,内部的选中状态缓存没有被正确清理,导致框架仍持有已失效项的引用。当尝试选中新的列表项时,这些残留的无效状态会引发崩溃。上述两种方法分别通过彻底重建List或主动同步状态,避免了无效状态的干扰。
内容的提问来源于stack exchange,提问作者Prabhunath Reddy R S
相关产品推荐
相关产品推荐

