SwiftUI:导航在带有部分的列表中无法正常工作

问题描述

我正在尝试为我声明的自定义枚举的每种不同情况构建一个带有Section的List。该列表显示并正常工作,并且模型的所有实例在各自的部分中均按案例进行分组,但是每当我尝试导航到详细信息视图时,它只会显示一秒钟,然后自动将我发送回列表,就像我按下后退按钮一样。这是我使用的代码

import SwiftUI

enum Enum: String,Identifiable,CaseIterable {
    var id: UUID { UUID() }
    case case1 = "Case 1"
    case case2 = "Case 2"
    case case3 = "Case 3"
}
    
struct ProvaView: View {
    
    func listaModelliPerCaso(caso: Enum) -> [Model] {
        let array = dm.models.filter { $0.caso == caso }
        return array
    }
    
    @Observedobject var dm: DataManager
    
    var body: some View {
        NavigationView {
            List {
                ForEach(Enum.allCases) { caso in
                    Section(header: Text(caso.rawValue)) {
                        ForEach(listaModelliPerCaso(caso: caso)) { model in
                            NavigationLink(
                                destination: ProvaDetailView(dm: dm,modello: model)) {
                                Text(model.nome)
                            }
                        }
                    }
                }
            }
            .navigationBarTitle(Text("Models List"),displayMode: .inline)
        }
    }
}

它是这样的:simulator screenshot

如果我使用类而不是枚举,则为每个个案创建一个实例并将其存储到数组中,然后使用ForEach调用它,问题就消失了。我真的很困惑为什么当它是枚举时它为什么表现不同(并以这种奇怪的方式)。

非常感谢您提供的任何帮助!

解决方法

问题出在您的枚举的再生ID(即UUID())上,因此对allCases的任何调用都会创建新的节并破坏/重新创建完整的List

解决方案是改用持久性的东西,例如rawValue

enum Enum: String,Identifiable,CaseIterable {
    var id: String { self.rawValue }               // << here !!
    case case1 = "Case 1"
    case case2 = "Case 2"
    case case3 = "Case 3"
}

在Xcode 12.1 / iOS 14.1上使用复制代码进行了测试