我正在尝试创建一个按钮,该按钮不仅可以导航到另一个视图,还可以同时运行一个功能。我尝试将NavigationLink和Button都嵌入到堆栈中,但是我只能单击Button。
ZStack {
NavigationLink(destination: TradeView(trade: trade)) {
TradeButton()
}
Button(action: {
print("Hello world!") //this is the only thing that runs
}) {
TradeButton()
}
}
答案 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:)