在swiftUI 中,我们知道可以通过navigationView来管理页面,通过NavigationLink跳转界面,如果想在跳转界面之前做相应的操作的话,可以用如下方法:
struct OneView: View{
@State var tag: Int? = nil
var body: some View{
NavigationView{
VStack{
NavigationLink(destination: TestView(),tag: 1,selection:$tag){
Button(action: {
//do some thing
tag = 1
}){
Text("into")
}
}
}
}
}
如果是在List中用NavigationLink跳转,也这么写的话例如:
struct OneView: View{
@State var tag: Int? = nil
var datas: [String] = ["one","two","three"]
var body: some View{
NavigationView{
VStack{
List{
ForEach(datas,id:\.self){
data in
NavigationLink(destination: TestView(),tag: 1,selection:$tag){
Button(action: {
//do some thing
tag = 1
}){
Text("into")
}
}
}
}
}
}
}
}
将会造成列表有多少项,它就会跳转多少下的问题,这也是我在实际开发中遇到的问题,这个问题的主要原因出在这个跳转是要满足tag的情况下才会跳转,所以需要selection的值跟tag的值是一样的才会跳转,那么问题来了,在列表中循环的创建link,如果你的tag还是都设置为1的话,那么在点击link的时候,你的点击操作会改变selection让其变成1,他会满足所有的tag要求,因为你的每个tag都是设置的1,所以,才会一直跳转,因为他都触发了。解决这个问题的方法也很简单,相信你也想到了,就是把tag设置为不同的值,我们这里就用index来代替tag:
struct OneView: View{
@State var tag: Int? = nil
var datas: [String] = ["one","two","three"]
var body: some View{
NavigationView{
VStack{
List{
ForEach(datas.indices,id:\.self){
index in
NavigationLink(destination: TestView(),tag: index,selection:$tag){
Button(action: {
//do some thing
tag = index
}){
Text("into")
}.buttonStyle(PlainButtonStyle())
}
}
}
}
}
}
}
这样更改后,就能实现在列表中点击不同item并执行相应操作也不会出现多次跳转的问题了。