簡體   English   中英

SwiftUI - 單擊 NavigationLink 時觸發其他操作

[英]SwiftUI - Trigger other actions when click NavigationLink

我在上層創建了一個帶有按鈕的列表視圖。 我想在用戶單擊 NavigationLink 后立即隱藏按鈕並且在詳細視圖中看不到它。

我通過使用@State var showAddButton成功實現它並通過如下所示的onDisappearonAppear操作控制它,但如果主視圖沒有完全消失,按鈕不會消失。

有沒有人有任何其他解決方案來觸發其他操作並保留 NavigationLink 的原始鏈接操作?

@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 的 position:

   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") }
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM