我的第一个视图中有一个加号按钮。看起来像一个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时,它不起作用。我该如何重写代码以包括长按?或者,也许我应该使它的工作方式与同时使用手势不同?
答案 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