Contents

onDragSessionUpdated(_:)

Specifies an action to perform on each update of an ongoing dragging operation activated by draggable(_:) or anther drag modifiers.

Declaration

nonisolated func onDragSessionUpdated(_ onUpdate: @escaping (DragSession) -> Void) -> some View

Discussion

Below is an example of a view that displays a book and supports dragging to copy, move, and delete. If the session ends with moving or deleting the item, in the onUpdate closure, the view lets the model layer know that the book should be deleted from the source.

   struct DraggableBookView: View {
       var id: UUID

       var body: some View {
           BookView()
               .draggable(
                   configuration: DragConfiguration(
                       operationsWithinApp: .init(allowMove: true, allowDelete: true),
                       operationsOutsideApp: .init(allowMove: true, allowDelete: true)
                   ), Book(id: id))
               .onDragSessionUpdated { session in
                   switch session.phase {
                   case .ended(at: _, with: let operation):
                       if operation == .move || operation == .delete {
                           if let id = session.draggedItemIDs(type: UUID.self).first {
                               removeBook(id: id)
                           }
                       }
                   default:
                       break
                   }
               }
       }
   }

   func removeBook(id: UUID) { }

The onUpdate closure is called when the closest drag session in the child view hierarchy becomes active.