带Section的List无法更新,这是iOS16的Bug吗?
iOS16 专属Bug:带Section的List无法通过Published变量触发自我刷新
该Bug仅在iOS16系统中出现,iOS15与iOS17环境下运行完全正常。已通过空项目复现:当通过withAnimation包裹@Published变量的修改操作,从登录页切换到包含Section的List页面时,List无法通过内部的@State变量更新自身内容。
复现代码
AppOB.swift
class AppOB: ObservableObject { static let shared = AppOB() @Published var token: String? }
App.swift
@main struct SwiftUIDebugApp: App { var body: some Scene { WindowGroup { ContentView() .environmentObject(AppOB.shared) } } }
ContentView.swift
struct ContentView: View { @EnvironmentObject var ob: AppOB var body: some View { VStack { if ob.token != nil { ListView() } else { LoginView() } } } }
LoginView.swift
struct LoginView: View { @EnvironmentObject var ob: AppOB var body: some View { NavigationView { VStack { Spacer() Button{ login() } label: { Text("login") } } } } func login() { withAnimation { // 移除withAnimation即可正常运行 ob.token = "123" } } }
ListView.swift
struct ListView: View { @State var list: [String] = [] var body: some View { NavigationView { // 或移除NavigationView即可正常运行 List { Section { // 或移除Section即可正常运行 ForEach(list, id: \.self) {item in HStack { Text(item) } } } } // .id(UUID()) // 或添加该id即可正常运行 } .onAppear { getList() } } func getList() { DispatchQueue.main.asyncAfter(deadline: .now() + 1) { // 模拟网络请求 self.list = ["apple", "pear"] } } }
可行修复方案
修改以下任意一处代码即可解决问题:
- 移除
LoginView中login()方法里的withAnimation包裹 - 移除
ListView中的NavigationView容器 - 移除
ListView中List内部的Section - 给
ListView中的List添加.id(UUID())修饰符
内容的提问来源于stack exchange,提问作者noveleven
相关产品推荐
相关产品推荐

