SwiftUI:导航在带部分的列表中无法正常工作
SwiftUI: Navigation doesn't work properly in List with Sections
我正在尝试为我声明的自定义枚举的每种不同情况构建一个包含部分的列表。该列表显示并完美运行,模型的所有实例都在各自的部分按案例分组,但每当我尝试导航到详细视图时,它只显示一秒钟,然后自动将我送回列表,就像我按下后退按钮一样。这是我使用的代码:
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 { [=10=].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
如果我使用 class 而不是枚举,为每个单个案例创建一个实例并将它们存储到一个数组中,然后用 ForEach 调用它,问题就会消失。我真的很困惑为什么当它是一个枚举时它的行为会有所不同(并且以一种奇怪的方式)。
非常感谢您提供的任何帮助!
问题出在您的枚举的重新生成的 ID(即 UUID()
)中,因此对 allCases
的任何调用都会创建新的部分并 destroy/recreate 完成 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
上使用复制代码进行测试
我正在尝试为我声明的自定义枚举的每种不同情况构建一个包含部分的列表。该列表显示并完美运行,模型的所有实例都在各自的部分按案例分组,但每当我尝试导航到详细视图时,它只显示一秒钟,然后自动将我送回列表,就像我按下后退按钮一样。这是我使用的代码:
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 { [=10=].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
如果我使用 class 而不是枚举,为每个单个案例创建一个实例并将它们存储到一个数组中,然后用 ForEach 调用它,问题就会消失。我真的很困惑为什么当它是一个枚举时它的行为会有所不同(并且以一种奇怪的方式)。
非常感谢您提供的任何帮助!
问题出在您的枚举的重新生成的 ID(即 UUID()
)中,因此对 allCases
的任何调用都会创建新的部分并 destroy/recreate 完成 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
上使用复制代码进行测试