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

iOS 15环境下Form视图中使用SwiftUI Picker发生随机崩溃问题求助

iOS15 Form内联WheelPicker随机崩溃解决方案

问题根因

这是iOS 15独有的系统级Bug,由UIPickerView内嵌到Form/List这类可复用单元格的滚动容器时,内部滚动视图内存管理异常触发野指针访问,表现为随机的EXC_BAD_ACCESS崩溃,iOS14及更早版本、iOS16及更高版本均不存在该问题。

可行修复方案

方案1:添加唯一id修饰符(成本最低,推荐)

给每个WheelPickerStyle的Picker添加唯一的.id()修饰符,强制SwiftUI不复用Picker视图,即可直接解决复用导致的内存异常,修改后的Picker代码示例:

// 第一个Picker
Picker("choose", selection: $picker1selection) {
    Text("value 0").tag(0)
    Text("value 1").tag(1)
    Text("value 2").tag(2)
    Text("value 3").tag(3)
    Text("value 4").tag(4)
}
.pickerStyle(WheelPickerStyle())
.id("picker1") // 新增唯一id

// 第二个Picker
Picker("choose", selection: $picker2selection) {
    Text("value 0").tag(0)
    Text("value 1").tag(1)
    Text("value 2").tag(2)
    Text("value 3").tag(3)
    Text("value 4").tag(4)
}
.pickerStyle(WheelPickerStyle())
.id("picker2") // 新增唯一id

原代码中的.compositingGroup()和.clipped(antialiased: true)修饰符和崩溃无关,也不会产生修复效果,可以直接删除。

方案2:改为Sheet弹出Picker

如果允许调整交互逻辑,点击按钮后通过Sheet弹窗承载Picker,完全避开Picker内嵌到滚动容器的场景,兼容性最佳,适合需要覆盖多系统版本的项目。

方案3:替换Form为自定义滚动布局

弃用系统Form组件,改用ScrollView + VStack配合自定义Section样式实现同等布局效果,绕开Form内部的单元格复用逻辑,也可以解决该崩溃问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:45:02