NavigationLink除了导航到另一个视图之外,还可以执行其他操作吗?

时间:2019-08-27 01:22:54

标签: swiftui

我正在尝试创建一个按钮,该按钮不仅可以导航到另一个视图,还可以同时运行一个功能。我尝试将NavigationLink和Button都嵌入到堆栈中,但是我只能单击Button。

                ZStack {
                    NavigationLink(destination: TradeView(trade: trade)) {
                        TradeButton()
                    }
                    Button(action: {
                        print("Hello world!") //this is the only thing that runs
                    }) {
                        TradeButton()
                    }
                }

4 个答案:

答案 0 :(得分:6)

您可以使用.simultaneousGesture来做到这一点。 NavigationLink将导航并同时完全按照您想要的方式执行操作:

NavigationLink(destination: TradeView(trade: trade)) {
                        Text("Trade View Link")
                    }.simultaneousGesture(TapGesture().onEnded{
                    print("Hello world!")
                })

答案 1 :(得分:2)

使用NavigationLink(_:destination:tag:selection :)初始化程序并将模型的属性作为 selection 参数传递。因为它是双向绑定,所以您可以为此属性定义 didset 观察者,然后在其中调用函数。

struct ContentView: View {
    @EnvironmentObject var navigationModel: NavigationModel

    var body: some View {
        NavigationView {
            List(0 ..< 10, id: \.self) { row in
                NavigationLink(destination: DetailView(id: row),
                               tag: row,
                               selection: self.$navigationModel.linkSelection) {
                    Text("Link \(row)")
                }
            }
        }
    }
}

struct DetailView: View {
    var id: Int;

    var body: some View {
       Text("DetailView\(id)")
    }
}

class NavigationModel: ObservableObject {
    @Published var linkSelection: Int? = nil {
        didSet {
            if let linkSelection = linkSelection {
                // action
                print("selected: \(String(describing: linkSelection))")
            }
        }
    }
}

在此示例中,您需要将模型作为环境对象传递给ContentView:

ContentView().environmentObject(NavigationModel())

在SceneDelegate和SwiftUI预览中。

该模型符合ObservableObject协议,并且该属性必须具有@Published属性。

(在列表中有效)

答案 2 :(得分:2)

您可以使用NavigationLink(destination:isActive:label :)。在绑定上使用setter来知道何时点击链接。我注意到,NavigationLink可以在内容区域之外点击,并且这种方法也可以捕获这些点击。

struct Sidebar: View {
    @State var isTapped = false

    var body: some View {
        NavigationLink(destination: ViewToPresent(),
                       isActive: Binding<Bool>(get: { isTapped },
                                               set: { isTapped = $0; print("Tapped") }),
                       label: { Text("Link") })
    }
}

struct ViewToPresent: View {
    var body: some View {
        print("View Presented")
        return Text("View Presented")
    }
}

我唯一注意到的是二传手会触发三遍,其中之一是在演示之后。这是输出:

Tapped
Tapped
View Presented
Tapped

答案 3 :(得分:0)

NNNNNNNNNNggcaaacagaatccagcagcacatcaaaaagcttatccacAGTAATTCATTATATCAAAATGCTCCAggccaggcgtggtggcttatgcc NNNNNNNNNNggcnnncngnnnccngcngcncnncnnnnngcnnnnccncNGNNNNNCNNNNNNNCNNNNNGCNCCNggccaggcgnggnggcnnnngcc + NavigationLink + isActive

onChange(of:)