当NavigationLink中有一个选择器时,我会遇到这样的情况。但是,当更改选择器切换时,它也会触发NavigationLink,您将被引导到一个新屏幕。这里有一些代码:
enum OptionTypes:Int,CaseIterable {
case option1
case option2
var title:String {
switch self {
case .option1:
return "Option 1"
case .option2:
return "Option 2"
}
}
}
struct ContentView: View {
@State var pickerState:OptionTypes = .option1
@State var isActive:Bool = false
var body: some View {
NavigationView {
NavigationLink(destination: Destination(), isActive:$isActive) {
Picker("Options", selection: self.$pickerState) {
ForEach(OptionTypes.allCases, id: .self) { type in
Text(type.title)
}
}
.pickerStyle(SegmentedPickerStyle())
.padding()
}
}
}
}
struct Destination:View {
var body: some View {
Text("Hello World")
}
}
理想的情况是让Picker拖动和点击手势不触发NavgiationLink。我尝试了highPriorityGesture
和simultaneousGesture
的不同排列,例如:
Picker("Options", selection: self.$pickerState) {
ForEach(OptionTypes.allCases, id: .self) { type in
Text(type.title)
}
}
.pickerStyle(SegmentedPickerStyle())
.highPriorityGesture(DragGesture(minimumDistance: 0.1, coordinateSpace: .global).onEnded { _ in
})
但这条路线似乎行不通。我还尝试让NavigationLink使用isActive
。然而,这似乎也没有得到尊重。即使我没有把isActive
变成真的,它仍然可以导航。我现在不确定如何独立于NavigationLink使用picker函数。
您需要以任何一种方式将NavigationLink
与Picker
分离,如
-
使不可见
NavigationLink(destination: Destination(), isActive:$isActive) { EmptyView() } Picker("Options", selection: self.$pickerState) { ForEach(OptionTypes.allCases, id: .self) { type in Text(type.title) } } .pickerStyle(SegmentedPickerStyle()) .padding()
-
后台
Picker("Options", selection: self.$pickerState) { ForEach(OptionTypes.allCases, id: .self) { type in Text(type.title) } } .pickerStyle(SegmentedPickerStyle()) .padding() .background( NavigationLink(destination: Destination(), isActive:$isActive) { EmptyView() })