NavigationView列表返回后选中状态丢失及计数异常问题
问题原因及解决方案
这是iOS 16中NavigationView搭配List、NavigationLink和selection绑定的已知兼容性bug——当从详情页返回时,系统会错误地重置或混乱List的选中状态,导致高亮和计数不匹配。
因为你需要兼容iOS 15,不能切换到NavigationStack,可以通过将导航跳转逻辑与List行的选中逻辑分离来解决,具体修改如下:
import SwiftUI struct ContentView: View { struct Ocean: Identifiable, Hashable { let name: String let id = UUID() } private var oceans = [ Ocean(name: "Pacific"), Ocean(name: "Atlantic"), Ocean(name: "Indian"), Ocean(name: "Southern"), Ocean(name: "Arctic") ] @State private var multiSelection = Set<Ocean>() // 新增导航相关状态 @State private var selectedOcean: Ocean? @State private var isNavigating = false var body: some View { NavigationView { VStack { List(oceans, id: \.self, selection: $multiSelection) { ocean in // 用Button替代直接嵌套NavigationLink,避免干扰选中状态 Button(action: { selectedOcean = ocean isNavigating = true }) { Text(ocean.name) } } // 将NavigationLink隐藏在背景中,通过isActive控制跳转 .background( NavigationLink(isActive: $isNavigating) { if let ocean = selectedOcean { Text(ocean.name) } } label: { EmptyView() } ) Text("\(multiSelection.count) selected") } .navigationTitle("Oceans") .toolbar { EditButton() } } } }
关键修改说明:
- 用
Button替代直接在List行内嵌套NavigationLink,避免NavigationLink的交互逻辑干扰List的选中状态管理 - 将
NavigationLink隐藏在List的背景中,通过isActive绑定控制跳转,确保选中状态不会因导航行为被系统错误重置 - 对单选场景同样适用,只需把
multiSelection替换为单个Ocean?类型的@State变量即可
内容的提问来源于stack exchange,提问作者Fred Klein
相关产品推荐
相关产品推荐

