SwiftUI - 单击 NavigationLink 时触发其他操作
SwiftUI - Trigger other actions when click NavigationLink
我在上层创建了一个带有按钮的列表视图。我想在用户单击 NavigationLink 并且在详细视图中看不到它后立即隐藏按钮。
我使用@State var showAddButton
实现成功,并通过onDisappear
和onAppear
操作控制它,如下所示,但如果主视图不消失,按钮不会消失完全地。
有没有人有任何其他解决方案来触发其他操作并保留 NavigationLink 的原始 link 操作?
@State var showAddButton = true
var body: some View {
ZStack{
NavigationView{
List{
ForEach(items, id: \.id){ item in
NavigationLink(destination: WorkItemDetailView(item: item)){
WorkItemListRow(item: item)
}.onDisappear{self.showAddButton = false}
.onAppear{self.showAddButton = true}
}
}
.navigationBarTitle("List", displayMode: .inline)
}
if showAddButton {
FloatAddButton()
}
}
}
如果你想将该按钮粘贴到主视图,你可以切换 ZStack 的位置:
NavigationView{
ZStack{
List{
ForEach(items, id: \.self){ item in
NavigationLink(destination: WorkItemDetailView(item: item)){
WorkItemListRow(item: item)
}
}
}
.navigationBarTitle("List", displayMode: .inline)
Button("mybutton",action: {})}
}
你也可以这样使用
struct NavigationBlock<Destination: View, Content: View>: View {
@State private var isActive: Bool = false
var destination: Destination
var content: (Binding<Bool>) -> Content
init(destination: Destination, @ViewBuilder content: @escaping (Binding<Bool>) -> Content) {
self.destination = destination
self.content = content
}
var body: some View {
Group {
content($isActive)
NavigationLink(destination: destination,
isActive: $isActive) { Spacer() }.hidden()
}
}
}
用法:
struct ContentView: View {
var body: some View {
NavigationView {
NavigationBlock(destination: Text("Hello")) { binding in
Button(action: {
print("User did tap 'Hello' button")
binding.wrappedValue = true
}) { Text("Hello button") }
}
}
}
}
我在上层创建了一个带有按钮的列表视图。我想在用户单击 NavigationLink 并且在详细视图中看不到它后立即隐藏按钮。
我使用@State var showAddButton
实现成功,并通过onDisappear
和onAppear
操作控制它,如下所示,但如果主视图不消失,按钮不会消失完全地。
有没有人有任何其他解决方案来触发其他操作并保留 NavigationLink 的原始 link 操作?
@State var showAddButton = true
var body: some View {
ZStack{
NavigationView{
List{
ForEach(items, id: \.id){ item in
NavigationLink(destination: WorkItemDetailView(item: item)){
WorkItemListRow(item: item)
}.onDisappear{self.showAddButton = false}
.onAppear{self.showAddButton = true}
}
}
.navigationBarTitle("List", displayMode: .inline)
}
if showAddButton {
FloatAddButton()
}
}
}
如果你想将该按钮粘贴到主视图,你可以切换 ZStack 的位置:
NavigationView{
ZStack{
List{
ForEach(items, id: \.self){ item in
NavigationLink(destination: WorkItemDetailView(item: item)){
WorkItemListRow(item: item)
}
}
}
.navigationBarTitle("List", displayMode: .inline)
Button("mybutton",action: {})}
}
你也可以这样使用
struct NavigationBlock<Destination: View, Content: View>: View {
@State private var isActive: Bool = false
var destination: Destination
var content: (Binding<Bool>) -> Content
init(destination: Destination, @ViewBuilder content: @escaping (Binding<Bool>) -> Content) {
self.destination = destination
self.content = content
}
var body: some View {
Group {
content($isActive)
NavigationLink(destination: destination,
isActive: $isActive) { Spacer() }.hidden()
}
}
}
用法:
struct ContentView: View {
var body: some View {
NavigationView {
NavigationBlock(destination: Text("Hello")) { binding in
Button(action: {
print("User did tap 'Hello' button")
binding.wrappedValue = true
}) { Text("Hello button") }
}
}
}
}