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

带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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:32:09