SwiftUI Picker在关闭fullScreenCover或sheet后功能异常问题求解
问题根因
这是SwiftUI的已知渲染异常,弹出并关闭全屏/半屏弹窗后,原有页面的Picker组件会出现手势交互绑定失效的问题,该问题和关闭弹窗的方式无关,属于系统组件的重绘bug。
可行修复方案
- 方案1:给Picker添加id修饰符强制重绘
给Picker绑定和选择值关联的唯一id,触发变更时强制组件重绘恢复交互,修改后的Picker代码如下:Picker("\(selectedFilterStatus.title)", selection: $selectedFilterStatus) { Text(ActiveStatus.active.title).tag(ActiveStatus.active) Text(ActiveStatus.inactive.title).tag(ActiveStatus.inactive) } .id(selectedFilterStatus) - 方案2:显式指定Picker样式
手动声明Picker的样式,避免系统默认样式的渲染异常,可根据需求选择对应样式:// 菜单样式 .pickerStyle(.menu) // 分段选择器样式 .pickerStyle(.segmented) // 轮盘样式 .pickerStyle(.wheel) - 方案3:替换已废弃的NavigationView
如果你适配的最低系统版本为iOS 16及以上,直接使用NavigationStack替代已经被苹果废弃的NavigationView,可以从根源规避该布局渲染bug,修改代码如下:struct ContentView: View { @State var selectedFilterStatus = ActiveStatus.active @State var showDetail = false var body: some View { NavigationStack { // 替换原有的NavigationView VStack { Button(action: { showDetail.toggle() }, label: { Text("Detail popup") }) Picker("\(selectedFilterStatus.title)", selection: $selectedFilterStatus) { Text(ActiveStatus.active.title).tag(ActiveStatus.active) Text(ActiveStatus.inactive.title).tag(ActiveStatus.inactive) } } .fullScreenCover(isPresented: $showDetail, content: { MyDetailsView(presenting: $showDetail) }) .navigationTitle("Main") } } }
内容的提问来源于stack exchange,提问作者Lars
相关产品推荐
相关产品推荐

