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

Posted

技术标签:

【中文标题】SwiftUI:导航在带有部分的列表中无法正常工作【英文标题】:SwiftUI: Navigation doesn't work properly in List with Sections 【发布时间】:2020-11-09 18:46:45 【问题描述】:

我正在尝试为我声明的自定义枚举的每个不同情况构建一个带有 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 调用它,问题就消失了。我真的很困惑为什么当它是一个枚举时它的行为会有所不同(并且以如此奇怪的方式)。

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

【问题讨论】:

【参考方案1】:

问题在于您的枚举的重新生成 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 上使用复制代码进行测试

【讨论】:

以上是关于SwiftUI:导航在带有部分的列表中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

带有部分的 SwiftUI 动态列表无法正确布局

.ondelete 带有部分的 SwiftUI 列表

SwiftUI 模式表在关闭后重新打开

自定义箭头键导航无法正常工作(部分工作)

带有列表的 SwiftUI 自定义导航栏

SwiftUI VStack 间距:无法正常工作