点击NavigationLink后如何执行操作?

时间:2019-11-17 04:18:40

标签: swiftui

我的第一个视图中有一个加号按钮。看起来像一个FAB按钮。在点击导航链接中的某些步骤后,我想隐藏它。到目前为止,我有这样的事情:

ForEach(0 ..< 12) {item in
    NavigationLink(destination: TransactionsDetailsView()) {
        VStack {
            HStack(alignment: .top) {
                Text("List item")
            }
            .padding(EdgeInsets(top: 5, leading: 10, bottom: 5, trailing: 10))
            .foregroundColor(.black)
            Divider()
        }
    }
    .simultaneousGesture(TapGesture().onEnded{
        self.showPlusButton = false
    })
        .onAppear(){
            self.showPlusButton = true
    }
}

单击即可正常工作。但是,当我长按NavigationLink时,它不起作用。我该如何重写代码以包括长按?或者,也许我应该使它的工作方式与同时使用手势不同?

4 个答案:

答案 0 :(得分:1)

是的,NavigationLink不允许同时手势(可能是设计好的,可能是由于问题引起的,无论如何)。

您期望的行为可以通过以下方式实现(当然,如果列表项中需要一些V形符号,则需要手动添加)

import SwiftUI

struct TestSimultaneousGesture: View {
    @State var showPlusButton = false
    @State var currentTag: Int?
    var body: some View {

        NavigationView {
            List {
                ForEach(0 ..< 12) { item in
                    VStack {
                        HStack(alignment: .top) {
                        Text("List item")
                        NavigationLink(destination: Text("Details"), tag: item, selection: self.$currentTag) {
                            EmptyView()
                        }
                    }
                    .padding(EdgeInsets(top: 5, leading: 10, bottom: 5, trailing: 10))
                    .foregroundColor(.black)
                    Divider()
                    }
                    .simultaneousGesture(TapGesture().onEnded{
                        print("Got Tap")
                        self.currentTag = item
                        self.showPlusButton = false
                    })
                    .simultaneousGesture(LongPressGesture().onEnded{_ in
                        print("Got Long Press")
                        self.currentTag = item
                        self.showPlusButton = false
                    })
                    .onAppear(){
                        self.showPlusButton = true
                    }
                }
            }
        }
    }
}

struct TestSimultaneousGesture_Previews: PreviewProvider {
    static var previews: some View {
        TestSimultaneousGesture()
    }
}

答案 1 :(得分:0)

我正在使用以下代码。我更喜欢它本身NavigationLink,因为它可以重用我现有的ButtonStyle


struct NavigationButton<Destination: View, Label: View>: View {
    var action: () -> Void = { }
    var destination: () -> Destination
    var label: () -> Label

    @State private var isActive: Bool = false

    var body: some View {
        Button(action: {
            self.action()
            self.isActive.toggle()
        }) {
            self.label()
              .background(
                ScrollView { // Fixes a bug where the navigation bar may become hidden on the pushed view
                    NavigationLink(destination: LazyDestination { self.destination() },
                                                 isActive: self.$isActive) { EmptyView() }
                }
              )
        }
    }
}

并使用它:

var body: some View {
  NavigationButton(
    action: { print("tapped!") },
    destination: { Text("Pushed View") },
    label: { Text("Tap me") }
  )
}

答案 2 :(得分:0)

我尝试了一种替代方法来解决我的问题。最初,我不使用“列表”,因为我的部分代码有问题。但是,这会引起另一个问题:在点击NavigationLink之后,PlusButton不会在下一个屏幕上消失。这就是为什么我要使用同时手势的原因-点击链接后,还将执行一些操作(此处:PlusButton将被隐藏)。但是效果不好。

我尝试了替代解决方案。使用列表(也许以后我会解决另一个问题。

这是我的替代代码。完全不需要sameGesture。燕尾形自动添加到列表中。而且PlusButton隐藏了我想要的。

import SwiftUI

struct BookingView: View {

    @State private var show_modal: Bool = false

    var body: some View {
        NavigationView {
            ZStack {
                List {
                    DateView()
                        .listRowInsets(EdgeInsets())

                    ForEach(0 ..< 12) {item in
                        NavigationLink(destination: BookingDetailsView()) {
                            HStack {
                                Text("Booking list item")
                                Spacer()
                            }
                            .padding()
                        }
                    }
                }.navigationBarTitle(Text("Booking"))

                VStack {
                    Spacer()
                    Button(action: {
                        print("Button Pushed")
                        self.show_modal = true
                    }) {
                        Image(systemName: "plus")
                            .font(.largeTitle)
                            .frame(width: 60, height: 60)
                            .foregroundColor(Color.white)
                    }.sheet(isPresented: self.$show_modal) {
                        BookingAddView()
                    }
                    .background(Color.blue)
                    .cornerRadius(30)
                    .padding()
                    .shadow(color: Color.black.opacity(0.3), radius: 3, x: 3, y: 3)
                }
            }

        }
    }

}

答案 3 :(得分:0)

我尝试过的另一种选择。不使用parallelGesture,而是使用onDisappear修饰符。代码很简单,并且可以正常工作。缺点是这些动作发生的时间有些延迟。因为首先是目标视图滑入,然后才执行操作。这就是为什么我仍然喜欢@Asperi的答案的原因,因为他在代码中添加了.simultaneousGesture(LongPressGesture)。

onWillPop