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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:02:09