[英]SwiftUI LazyVGrid NavigationLink has unusual animation on return
[英]SwiftUI NavigationLink in LazyVGrid picking random index
每次选择一行时,系统决定将随机索引转发到下一个视图。
下面是代码:
struct TestView: View {
let columns = [
GridItem(.flexible())
]
@State var showDetail = false
var body: some View {
ScrollView {
LazyVGrid(columns: columns, spacing: 20) {
ForEach(1...10, id: \.self) { index in
Text("\(index)")
.background(NavigationLink(destination: TestDetail(index: index), isActive: $showDetail) {
EmptyView()
}).onTapGesture {
showDetail = true
}
}
}
}
}
}
struct TestView_Previews: PreviewProvider {
static var previews: some View {
TestView()
}
}
struct TestDetail: View {
var index: Int
var body: some View {
Text("\(index)")
}
}
您一次激活所有链接(因为所有链接都取决于一种状态)。 相反,我们需要为这种情况使用不同的NavigationLink
构造函数。
这里是固定变体。 使用 Xcode 12.1 / iOS 14.1 测试
struct TestView: View {
let columns = [
GridItem(.flexible())
]
@State var selectedItem: Int?
var body: some View {
ScrollView {
LazyVGrid(columns: columns, spacing: 20) {
ForEach(1...10, id: \.self) { index in
Text("\(index)")
.background(NavigationLink(destination: TestDetail(index: index), tag: index, selection: $selectedItem) {
EmptyView()
}).onTapGesture {
selectedItem = index
}
}
}
}
}
}
您应该使用标准的 NavigationLink 功能,它会自动将其转换为按钮 - 您实际上并不需要 .background 和 .onTapGesture。
ForEach(1...10, id: \.self) { index in
NavigationLink(
destination: TestDetail(index: index),
label: {
Text("\(index)")
})
.accentColor(.primary)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.