我有一个名为
Diem
的 SwiftData 模型,其中包含变量 id
、name
和 date
。我想从 HomeView 导航到 DiemDetail,但 NavigationLink 不起作用。 Xcode 显示没有错误。
struct HomeView: View {
@Query(sort: \Diem.date)
private var diems: [Diem]
var body: some View {
NavigationStack {
DiemsGrid()
.navigationDestination(for: Diem.ID.self) { diemID in
if let diem = diems.first(where: { $0.id == diemID }) {
DiemDetail(diem: diem)
}
}
}
}
}
struct DiemsGrid: View {
@Query(sort: \Diem.date) var diems: [Diem]
var body: some View {
ScrollView(.vertical) {
LazyVGrid(columns: layout, spacing: 0) {
ForEach(diems) { diem in
DiemGridItem(diem: diem)
}
}
}
}
}
struct DiemGridItem: View {
var diem: Diem
var body: some View {
NavigationLink(value: diem.id) {
// View code
}
}
}
还有迪姆细节
struct DiemDetail: View {
var diem: Diem
var body: some View {
NavigationStack {
VStack() {
// views
}
.toolbar {
// views
}
}
}
}
Diem
模型都很好。我确实在 DiemDetail 和 HomeView 中有一个 .sheet
,但我不认为这就是问题所在。
首先,您在
NavigationStack
和 HomeView
上都有重复的 DiemDetail
。 DiemDetail 还具有来自其父级 HomeView 的导航。除非你删除它,否则它将不起作用,因为你第一次推送到 DiemDetail
时,导航将被替换为嵌套导航,它不再处理 .navigationDestination
。
其次,
NavigationLink
中的DiemGridItem
采用正确的类型,该类型与来自其祖先的.navigationDestination
进行映射。但是,您没有提供其外观,这就是为什么您没有看到任何可点击的链接。
struct DiemGridItem: View {
var diem: Diem
var body: some View {
NavigationLink(value: diem.id) {
Text(diem.id.uuidString)
}
}
}