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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:17:41