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

如何在iOS 16及以上版本的SwiftUI中恢复Form内Picker的旧版导航式选择行为?

恢复iOS 16之前Form内Picker的跳转式选择行为

当然可以找回这种经典的Picker交互!苹果在iOS 16调整了Form容器内Picker的默认样式,移除了跳转至新页面的行为,但我们可以通过自定义组件的方式完美复刻旧版体验。

核心思路

用NavigationLink模拟旧版Picker的外观和跳转逻辑,在跳转后的页面中放置一个内联样式的Picker,通过绑定值同步选中状态,实现和旧版完全一致的交互流程。

完整实现代码

struct ContentView: View {
    @State private var selectedValue = "One"
    let counts = ["One", "Two", "Three"]
    
    var body: some View {
        // 兼容iOS16+用NavigationStack,iOS15及以下替换为NavigationView
        NavigationStack {
            Form {
                Section {
                    // 模拟旧版Picker的外观:左侧标题+右侧选中值
                    NavigationLink(destination: SelectionView(selectedValue: $selectedValue, counts: counts)) {
                        HStack {
                            Text("Selection")
                            Spacer()
                            Text(selectedValue)
                                .foregroundColor(.secondary)
                        }
                    }
                }
            }
            .navigationTitle("Settings")
        }
    }
}

// 跳转后的选择页面,完全复刻旧版Picker的选择界面
struct SelectionView: View {
    @Binding var selectedValue: String
    let counts: [String]
    @Environment(\.dismiss) private var dismiss // iOS15+的返回方式
    
    var body: some View {
        Form {
            Picker("Selection", selection: $selectedValue) {
                ForEach(counts, id: \.self) {
                    Text($0)
                }
            }
            .pickerStyle(.inline) // 确保Picker是内联展示,和旧版一致
        }
        .navigationTitle("Choose Option")
        .toolbar {
            // 添加Done按钮,模拟旧版选择完成后的确认逻辑(也可以依赖默认导航返回)
            Button("Done") {
                dismiss()
            }
        }
    }
}

关键细节说明

  • 外观还原:通过HStack实现旧版Picker的标题+右侧选中值的布局,点击区域和旧版完全一致
  • 状态同步:使用@Binding绑定选中值,确保选择页面的操作能实时同步到主页面
  • 兼容处理:如果需要兼容iOS15及以下,只需把NavigationStack替换为NavigationView,并将@Environment(\.dismiss)替换为@Environment(\.presentationMode) private var presentationMode,然后在Done按钮中调用presentationMode.wrappedValue.dismiss()
  • 样式匹配:目标页面的Picker使用.inline样式,和旧版跳转后的选择界面样式完全对齐

内容的提问来源于stack exchange,提问作者nets-rac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:12:30