我在 List/ForEach 中声明了两个单独的项目列表,如下所示:
List {
ForEach(model) { item in
ItemView(item)
.tag(item.id)
}
.onMove(perform: { rows, newIndex in
model.move(items: rows, destination: newIndex)
})
}
两个列表都使用不同的模型,由其 ID 标识。然而,在 macOS 上,我意识到我可以将项目从一个列表拖动到另一个列表,尽管它们的 ID 不同。
是否有可能在拖动时禁用另一个列表的放置功能(例如通过
.onInsert()
)?我已经使用 NSItemProviderReading
和 NSItemProviderWriting
实现了一个功能,能够检测用户何时开始拖动。
您可以尝试忽略插入,就像在适合我的测试代码中一样:
struct ContentView: View {
@State private var model1 = ["One", "Two", "Three", "Four"]
@State private var model2 = ["Five", "Six", "Seven", "Eight"]
var body: some View {
VStack {
List {
ForEach(model1, id: \.self) { item in
Text(item)
}
.onMove { (indexSet, index) in
model1.move(fromOffsets: indexSet, toOffset: index)
}
.onInsert(of: [UTType.text]) { pos,prov in
print("\n-----> ignoring insert in model1")
}
}
Divider()
List {
ForEach(model2, id: \.self) { item in
Text(item)
}
.onMove { (indexSet, index) in
model2.move(fromOffsets: indexSet, toOffset: index)
}
.onInsert(of: [UTType.text]) { pos,prov in
print("\n-----> ignoring insert in model2")
}
}
}
}
}
此代码实际上在带有 XCode 15.4 的 macOS 14.5 中不再工作。 onInsert 代码永远不会被触发,也不会出现任何可以在任一列表中插入项目的视觉指示符。 似乎 of 类型没有被正确识别,或者 onInsert 在 MacOS 中不再起作用。 有什么想法吗?