Post

Replies

Boosts

Views

Activity

Drag and drop in a Form
I have made a simple drag and drop of capsule text item to drop on a Text zone. The targeted Text value is getting the dropped item as text and it changes is value. The following code works correctly and I am sure it can be useful for beginners who want to perform drag & drop. The problem I am encountering is that when the draggable item is contained in a Form, then the all form is dragged instead of only the selected item only. To reproduce it just uncomment the Form { } Am I missing something or is it really a bug ? import SwiftUI import UniformTypeIdentifiers struct DragView: View { 		var body: some View { 				//Form{ 						HStack{ 								DropText() 								VStack{ 										ForEach((1...10).reversed(), id: \.self) { 												CapsuleText(text: "Test \($0)") 										} 								} 						} 			 // } 		} } struct DropText: View { 		@State var myText: String = "Glisser ici" 		@State var targeted: Bool = false 		@State private var onDrag = false 		 		var body: some View { 				VStack{Text(myText)} 						.font(.footnote) 						.padding() 						.foregroundColor(.white) 						.background(targeted ? Color.red : Color.green) 						.clipShape(Capsule()) 						.onDrop(of: [UTType.text], delegate: DragRelocateDelegate(dropText: $myText, onDrag: $onDrag)) 		} } struct CapsuleText: View { 		var text: String 		@State private var onDrag = false 		 		var body: some View { 				VStack{Text(text)} 						.font(.footnote) 						.padding() 						.foregroundColor(.white) 						.background(onDrag ? Color.gray : Color.blue) 						.clipShape(Capsule()) 						.onDrag { 								self.onDrag = true 								return NSItemProvider(object: String(text) as NSString) 						} 		} } struct DragRelocateDelegate: DropDelegate { 		@Binding var dropText: String 		@Binding var onDrag: Bool 		 		func dropEntered(info: DropInfo) { 		} 		 		func dropUpdated(info: DropInfo) -> DropProposal? { 				return DropProposal(operation: .move) 		} 		 		func performDrop(info: DropInfo) -> Bool { 				guard info.hasItemsConforming(to: [UTType.text]) else { 						return false 				} 				let items = info.itemProviders(for: [UTType.text]) 				for item in items { 						_ = item.loadObject(ofClass: String.self) { str, _ in 								if let str = str { 										dropText = str 								} 						} 				} 				return true 		} }
1
0
858
Sep ’20