ios - 如何在不禁用列表项命中测试的情况下启用对列表项的选择?
问题描述
我正在尝试创建一个文件浏览器,用户可以在其中将我的 LibraryView 中的条目拖放到主视图上以显示它们。同样有效的是上下文菜单,用户可以在其中右键单击以删除或编辑文件上的首选项。问题是,如果我在文件的文本标签上禁用命中测试,我无法拖放文件,但选择有效...如果我启用命中测试,我无法单击文件的文本标签选择它。这是我的代码,任何帮助将不胜感激......
struct LibraryView: View {
@ObservedObject var viewModel = LibraryViewModel()
var body: some View {
List(selection: $viewModel.selectedNodes) {
ForEach(viewModel.nodes, id: \.self) { node in
if let childrenNodes = node.childrenValues, childrenNodes.count > 0 {
Section(header: Text(node.displayName)) {
ForEach(childrenNodes, id: \.self) { childNode in
LibraryNodeChildView(node: childNode).contextMenu {
Button(action:{
store.dispatch(LibraryAction.removeNode(childNode))
store.dispatch(LibraryThunkCreatorImpl().persistLibraryState())
}){
HStack {
Text("Delete")
Image(systemName: "trash")
}
}
Button(action:{
}){
HStack {
Text("Edit Preferences")
Image(systemName: "gear")
}
}
}
}
}
}
}
}.listStyle(SidebarListStyle())
.onAppear() {
store.dispatch(LibraryThunkCreatorImpl().loadLibraryState())
}.onDrop(of: ["public.url","public.file-url"], isTargeted: nil) { (items) -> Bool in
if let item = items.first {
if let identifier = item.registeredTypeIdentifiers.first {
print("onDrop with identifier = \(identifier)")
if identifier == "public.url" || identifier == "public.file-url" {
item.loadItem(forTypeIdentifier: identifier, options: nil) { (urlData, error) in
DispatchQueue.main.async {
if let urlData = urlData as? Data {
let url = NSURL(absoluteURLWithDataRepresentation: urlData, relativeTo: nil) as URL
let thunk = LibraryThunkCreatorImpl().createAddNodeThunk(url: url)
store.dispatch(thunk)
}
}
}
}
}
return true
} else {
print("item not here")
return false
}
}
}
}
struct LibraryNodeChildView: View {
let node: LibraryNode
var body: some View {
HStack {
if let image = node.image {
Image(nsImage: image)
.resizable()
.scaledToFit()
.frame(width: 15, height: 15)
}
Text(verbatim: node.displayName).onDrag {
NSItemProvider(object: node.url as NSURL)
}.allowsHitTesting(false)
.font(.subheadline)
}
}
}
解决方案
正如这里提到的,解决方案是将拖放绑定到项目容器,并将上下文菜单绑定到容器内的项目。
HStack {
Text(verbatim: node.displayName)
.contextMenu {
// handle context menu
}
}
.onDrag {
// handle drag
}
}
推荐阅读
- ios - segue后位置管理器不在主线程上?
- django - 使用 django-mptt 查询数据库中包含至少一个子类别和至少一个产品的所有根类别
- node.js - 将对象转换为字符串并带入必要的形式
- postgresql - 如果在 postgreSQL 中需要,如何编写函数来恢复已删除的信息
- python-3.x - 如何并行或同时对列表的所有元素执行计算以减少运行时间?
- javascript - 可点击的 div 充当按钮功能 react js
- sed - sed 替换第一场比赛中的所有行不起作用
- python - 从电源外壳午餐时,Jupyter Notebook 内核未连接
- angular - 以角度将对象推送到表格组件
- laravel - 在视图刀片 Laravel 中显示来自控制器的计算