Я экспериментирую с перетаскиванием, чтобы позже включить его в свое приложение.
Я предлагаю рабочее решение, которое позволяет перетаскивать элемент из VStack, и оно отлично работает на iOS 13.5 .
К сожалению, тот же код не работает в симуляторе iOS 14.0 (Xcode 12 beta 3).
iOS 13.5: при выпадении элемента сначала вызывается loadData, а затем вызывается объект, и поставщики в onDrop содержат элемент
iOS 14.0: при удалении элемента функции не вызываются, а поставщики в onDrop пусты
Я не могу понять, iOS 14.0 требует дополнительного кода или это проблема iOS 14.
Есть идеи?
struct ContentView: View {
@ObservedObject var model = Model()
var body: some View {
HStack {
Spacer()
VStack {
ForEach(model.items, id: \.name) { item in
ItemView(item: item)
}
}
Spacer()
DropView().environmentObject(model)
}
}
}
struct ItemView: View {
var item: Item
var body: some View {
Text(item.name)
.onDrag({
NSItemProvider(object: self.item)
})
}
}
struct DropView: View {
@EnvironmentObject var model: Model
var body: some View {
Text("Drop Here")
.onDrop(of: [Item.typeIdentifier], isTargeted: nil) { providers, position in
print("providers \(providers) position \(position)")
guard let provider = providers.first(where: { provider in provider.hasItemConformingToTypeIdentifier(Item.typeIdentifier) })
else {
return false
}
provider.loadObject(ofClass: Item.self) { reading, _ in
guard let item = reading as? Item else {
return
}
DispatchQueue.main.async {
self.model.items.removeAll(where: { a in a.name == item.name })
}
}
return true
}
}
}
class Model: ObservableObject {
@Published var items = [
Item(name: "Item 1"),
Item(name: "Item 2"),
Item(name: "Item 3"),
Item(name: "Item 4"),
]
}
class Item: NSObject {
public static let typeIdentifier = "dnd.item"
var name: String
init(name: String) {
self.name = name
super.init()
}
}