我有一个带有NavigationLinks的列表。
List {
ForEach(items, id: \.id) { item in
NavigationLink(destination: ItemView(), tag: item.id, selection: self.$viewModel.selectedItemId) {
Text("Some text")
}
}
.onDelete(perform: delete)
}
.id(UUID())
还有一个对应的ViewModel,用于存储所选项目的ID。
class ViewModel: ObservableObject {
@Published var selectedItemId: String? {
didSet {
if let itemId = selectedItemId {
...
}
}
}
...
}
问题是当我使用NavigationLink(destination:tag:selection:)
时,过渡动画消失了-子视图立即弹出。当我使用NavigationLink(destination:)
时,它可以正常工作,但由于选择了NavigationLink时需要执行一些操作,因此无法使用它。
为什么过渡动画不见了? NavigationLink(destination:tag:selection:)
有问题吗?
答案 0 :(得分:2)
您可以将操作放入NavigationLink中。这应该可以解决您的动画问题:
List {
ForEach(items, id: \.id) { item in
NavigationLink(destination: ItemView(), isActive: $isActive, tag: item.id, selection: self.$viewModel.selectedItemId) {
EmptyView()
}
Button(action: {
// The action you wand to have done, when the View pops.
print("Test")
self.isActive = true
}, label: {
Text("Some text")
})
}
.onDelete(perform: delete)
}
.id(UUID())
答案 1 :(得分:0)
事实证明,列表末尾的.id(UUID())
有问题。删除它会恢复过渡动画:
List {
ForEach(items, id: \.id) { item in
NavigationLink(destination: ItemView(), tag: item.id, selection: self.$viewModel.selectedItemId) {
Text("Some text")
}
}
.onDelete(perform: delete)
}
//.id(UUID()) <- removed this line
我在此链接How to fix slow List updates in SwiftUI之后添加了此内容。使用NavigationLink(destination:tag:selection:)
时,这种骇客会弄乱标签/选择。