I am experimenting with drag & drop to later include it in my app.
I come up with a working solution which allows to drag an item from a VStack and it works just fine on iOS 13.5.
Unfortunately, the same code doesn't work on iOS 14.0 simulator (Xcode 12 beta 3).
iOS 13.5: On Item drop, first loadData is called and then object is called and providers in onDrop contains an item
iOS 14.0: On Item drop no functions are called and providers in onDrop is empty
I am not able to figure out if iOS 14.0 requires additional code or this is an issue of iOS 14.
Any idea?
I come up with a working solution which allows to drag an item from a VStack and it works just fine on iOS 13.5.
Unfortunately, the same code doesn't work on iOS 14.0 simulator (Xcode 12 beta 3).
iOS 13.5: On Item drop, first loadData is called and then object is called and providers in onDrop contains an item
iOS 14.0: On Item drop no functions are called and providers in onDrop is empty
I am not able to figure out if iOS 14.0 requires additional code or this is an issue of iOS 14.
Any idea?
Code Block 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() } }