SwiftUI list执行操作再跳转

在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并执行相应操作也不会出现多次跳转的问题了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值