SwitUI - 列表中的两个导航链接

Bin*_*ang 2 list ios swiftui vstack swiftui-navigationlink

我的列表单元格中有两个 NavigationLink

我想在点击一次时转到目的地 1,在点击两次时转到目的地 2。所以我添加了两个点击手势来控制导航。

但是当我点击时,有两个问题:

  • 1 不会调用点击手势块。
  • 2 即使两个导航链接位于 TextView 后面,它们也会自动激活。真正的效果是:点击单元格 -> 前往 Destination1 -> 返回首页 -> 前往 Destination2 -> 返回首页

这是我的代码:

struct MultiNavLink: View {
    @State var mb_isActive1 = false;
    @State var mb_isActive2 = false;
    
    var body: some View {
        return
            NavigationView {
                List {
                    ZStack {
                        NavigationLink("", destination: Text("Destination1"), isActive: $mb_isActive1)
                        NavigationLink("", destination: Text("Destination2"), isActive: $mb_isActive2)
                        Text("Single tap::go to destination1\nDouble tap,go to destination2")
                    }
                    .onTapGesture(count: 2, perform: {()->Void in
                        NSLog("Double tap::to destination2")
                        self.mb_isActive2 = true
                    }).onTapGesture(count: 1, perform: {()->Void in
                        NSLog("Single tap::to destination1")
                        self.mb_isActive1 = true
                    })
                }.navigationBarTitle("MultiNavLink",displayMode: .inline)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试删除 List 元素,然后一切都按我的预期进行。似乎是 List 元素让一切变得奇怪。

我发现这个问题:SwiftUI - List 中的两个按钮,但情况与我不同。

我期待您的答复,非常感谢您...

Asp*_*eri 5

尝试以下方法 - 其想法是隐藏可见内容背景中的链接,并使它们对 UI 不活动,但以编程方式激活。

使用 Xcode 12 / iOS 14 进行测试。

struct MultiNavLink: View {

    var body: some View {
        return
            NavigationView {
                List {
                    OneRowView()
                }.navigationBarTitle("MultiNavLink", displayMode: .inline)
        }
    }
}

struct OneRowView: View {
    @State var mb_isActive1 = false
    @State var mb_isActive2 = false

    var body: some View {
        ZStack {
            Text("Single tap::go to destination1\nDouble tap,go to destination2")
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .contentShape(Rectangle())
        .background(Group {
            NavigationLink(destination: Text("Destination1"), isActive: $mb_isActive1) {
                    EmptyView() }
                .buttonStyle(PlainButtonStyle())
            NavigationLink(destination: Text("Destination2"), isActive: $mb_isActive2) {
                    EmptyView() }
                .buttonStyle(PlainButtonStyle())
        }.disabled(true))
        .highPriorityGesture(TapGesture(count: 2).onEnded {
            self.mb_isActive2 = true
        })
        .onTapGesture(count: 1) {
            self.mb_isActive1 = true
        }
    }
}
Run Code Online (Sandbox Code Playgroud)