Xcode15中@SceneStorage无法持久化选中标签,@AppStorage正常的原因?
@SceneStorage无法持久化Tab选中状态的原因(Xcode15)
问题描述
尝试用@SceneStorage持久化TabView的选中标签信息,编写代码如下:
struct MainView: View { @SceneStorage("selectedTab") var selectedTab: String = "list" var body: some View { TabView(selection: $selectedTab) { Text("1") .tabItem(Text("1")).tag("1") Text("2") .tabItem(Text("2")).tag("2") Text("3") .tabItem(Text("3")).tag("3") } } }
实际测试发现@SceneStorage无法存储数据,改用@AppStorage则能正常工作,使用环境为Xcode15。
原因分析
@SceneStorage的作用域限定在单个场景的生命周期内,当对应的场景被系统销毁时,存储的数据会被清除。在Xcode15对应的iOS/iPadOS版本中,TabView作为根视图时,其选中状态的变更无法正确触发@SceneStorage的持久化更新机制,系统没有将该状态变更识别为需要保存的场景状态。@AppStorage基于UserDefaults实现,作用域覆盖整个应用,不受单个场景生命周期的影响,因此可以稳定保存Tab选中状态。- 额外注意:代码中
selectedTab的初始值设为"list",但所有标签的tag都是"1"、"2"、"3",这会导致首次加载时选中状态异常,建议将初始值修改为与某个tag匹配的内容(比如"1"),避免状态不匹配的问题。
内容的提问来源于stack exchange,提问作者elk_cloner
相关产品推荐
相关产品推荐

