[英]SwiftUI - Loss of .onDelete Functionality in List as a result of DragGesture
DragGesture() 导致列表内的.onDelete function 功能丢失。 我做了一个交互的基本例子:
class MenuViewModel: ObservableObject {
@Published var dragEnabled: Bool = true
}
struct RootView: View {
@StateObject var viewModel = MenuViewModel()
var body: some View {
ZStack {
NavView()
}
.environmentObject(viewModel)
// Can be diabled on ChildView, but will need to be re-enabled on RootView
.gesture(DragGesture()
.onChanged { _ in
guard viewModel.dragEnabled else { return }
print("Drag Gesture Active")
})
}
}
struct NavView: View {
var body: some View {
NavigationView {
NavigationLink {
ChildView()
} label: {
Text("Go to ChildView")
}
Text("Drag Gesture needs to be enabled")
}
.navigationViewStyle(.stack)
}
}
struct ChildView: View {
@EnvironmentObject var viewModel: MenuViewModel
@State var list = ["1", "2", "3"]
var body: some View {
List {
ForEach(list, id: \.self) { item in
Text(item)
}
.onDelete { indexSet in
print("OnDelete Works!")
list.remove(atOffsets: indexSet)
}
.navigationTitle("OnDelete Enabled")
}
.onAppear {
viewModel.dragEnabled = false
print("Drag Gesture Disabled")
}
.onDisappear {
viewModel.dragEnabled = true
print("Drag Gesture Enabled")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
RootView()
}
}
尝试使用:
一切都没有按预期工作。 任何建议,将不胜感激。 我知道在这个例子中 DragGesture 没有做任何事情。 我在我的应用程序中使用 DragGesture,因此用户可以将侧边菜单拖动到视图中。
您可以使用GestureMask
启用/禁用父或子手势。 在RootView
中执行此操作:
var body: some View {
ZStack {
NavView()
}
.environmentObject(viewModel)
// Can be diabled on ChildView, but will need to be re-enabled on RootView
.gesture(DragGesture()
.onChanged { _ in
guard viewModel.dragEnabled else { return }
print("Drag Gesture Active")
}, including: viewModel.dragEnabled ? .gesture : .subviews) // here
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.