【发布时间】:2021-01-31 14:25:07
【问题描述】:
我的 macOS 应用的侧边栏中有一个列表。当我添加 .onDrag 修饰符时,拖动 NSItemProvider 可以正常工作,但单击/选择项目以触发 NavigationLink 会被阻止。
struct ContentView: View {
var body: some View {
NavigationView {
List(Data.items) { item in
NavigationLink(
destination: Text(item.text),
label: {
Text(item.text)
.lineLimit(5)
// Enabling dragging with .onDrag {} disables click and selection:
.onDrag { return NSItemProvider(object: item.url as NSURL) }
})
}
Text("Placeholder")
}
}
}
如何在保持正常列表选择行为不变的同时添加拖动行为?
这是最小可重现示例的其余部分:
import SwiftUI
@main
struct ListDragExampleApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct Data {
struct Item: Identifiable {
let id = UUID()
let text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
let url = URL(string: "http://example.com")!
}
static let items = [
Item(),
Item(),
Item()
]
}
【问题讨论】:
-
没有Minimal Reproducible Example 无法帮助您解决问题。
-
谢谢@loremipsum!我添加了一个最小可重现示例。
-
我遇到了同样的行为,NavigationLink 中的 Dragable View 会破坏正常的 NavigationLink 行为。有时可以点击链接,有时不能。也在寻找解决方案。箭头键工作正常,您可以在列表中上下移动,但使用鼠标似乎有问题。
-
发生的情况是,当您单击文本时,单元格没有被选中。当您在文本外部单击时,单元格将被选中。解决方法是使用通过 State var 控制选择的列表,并将 TapGesture 添加到您的 Text 并更新 State var。挑战在于区分命令点击和普通点击,因为选择行为应该表现不同
标签: swiftui swiftui-list swiftui-navigationlink