SwiftUI选取器和NavigationLink手势冲突



当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。我尝试了highPriorityGesturesimultaneousGesture的不同排列,例如:

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函数。

您需要以任何一种方式将NavigationLinkPicker分离,如

  1. 使不可见

    NavigationLink(destination: Destination(), isActive:$isActive) {
    EmptyView()
    }
    Picker("Options", selection: self.$pickerState) {
    ForEach(OptionTypes.allCases, id: .self) { type in
    Text(type.title)
    }
    }
    .pickerStyle(SegmentedPickerStyle())
    .padding()
    
  2. 后台

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

最新更新