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

