SwiftUI自定义Segment Picker状态持久化:设置默认选中项
解决Segment Picker重启后默认选中指定分段的问题
你的核心需求是:App运行期间切换视图时,保持Segment Picker的选中状态;但App完全关闭重启后,自动选中默认的分段(索引1)。当前代码的问题在于,冷启动时会读取UserDefaults中保存的上次选中索引,导致无法回到默认值。
解决方案
通过在App启动时重置UserDefaults中的选中索引为默认值,同时保留视图切换时的状态保存逻辑,即可实现需求:
- 修改App入口文件(比如
YourApp.swift),在冷启动时重置默认选中索引:
@main struct YourApp: App { init() { // 每次App冷启动时,将选中索引重置为默认值1 UserDefaults.standard.set(1, forKey: "sIndex") } var body: some Scene { WindowGroup { ContentView() } } }
- 简化ContentView代码,保留视图切换时的状态读取和保存逻辑:
struct ContentView: View { @State private var selSegmentIndex: Int = 1 init() { // 读取UserDefaults中的状态,用于视图间切换时维持选中状态 if let savedSIndex = UserDefaults.standard.value(forKey: "sIndex") as? Int { self.selSegmentIndex = savedSIndex } } var body: some View { CustomPicker(index: $selSegmentIndex) .onDisappear { // 视图消失时保存当前选中状态,供其他视图返回时读取 UserDefaults.standard.set(selSegmentIndex, forKey: "sIndex") } } }
逻辑说明
- 冷启动时,App的
init方法会先将UserDefaults中的sIndex重置为1,ContentView初始化时读取该值,默认选中分段1。 - 运行期间切换分段后,视图消失时会将当前选中索引保存到
UserDefaults,从其他视图返回时,ContentView会读取保存的值,维持之前的选中状态。 - 每次App关闭重启,都会重复冷启动的重置逻辑,确保默认选中分段1。
内容的提问来源于stack exchange,提问作者r360
相关产品推荐
相关产品推荐

