Estoy tratando de crear una aplicación de prueba simple para aprender las API de arrastrar y soltar. Para esta pregunta, me estoy enfocando solo en el escenario Drop. Tengo un controlador de vista en blanco, con la aplicación de safari abierta (multitarea), luego trato de arrastrar una imagen de Google a la vista del controlador de vista.
Puedo arrastrar la imagen de safari al controlador de vista de mi aplicación, pero cuando la suelto, esta llamada a continuación nunca se llama:
func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession)Este es mi código:
class EditTestVC: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. view.addInteraction(UIDropInteraction(delegate: self)) } } extension EditTestVC:UIDropInteractionDelegate { func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool { // 1 print("canHandle session: \(session)") return true // return session.canLoadObjects(ofClass: UIImage.self) } func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal { // 2 print("sessionDidUpdate session: \(session)") return UIDropProposal(operation: .copy) } func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) { print("performDrop session: \(session)") } }Los dos métodos principales se llaman, éste:
func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Booly éste:
func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposalEntonces, estoy tratando de averiguar por qué este:
func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession)nunca se llama.
¿Cualquier sugerencia?
En mi caso fue un error de programación donde he escrito lo siguiente:
func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal { return UIDropProposal(operation: .move) } ¡Pero no siempre puedes usar move ! ¡Solo si session.allowsMoveOperation es true !
De la documentación de la mudanza :
Puede usar esta operación solo si la propiedad allowMoveOperation de la sesión de eliminación es verdadera; de lo contrario, se trata como una operación UIDropOperation.cancel. [...]
De la documentación de cancelación :
Si el usuario intenta soltar una actividad, la operación de arrastrar se cancela y no se llama al método de delegado dropInteraction(_:performDrop:) .
en primer lugar, a partir de iOS 15 dragSessionAllowsMoveOperation es verdadero de forma predeterminada
Discusión Si no implementa este método, el valor de retorno predeterminado es SÍ.
En mi caso func collectionView(_ collectionView: UICollectionView, performDropWith coordinator: UICollectionViewDropCoordinator)
no fue llamado porque había establecido un punto de interrupción dentro
func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?)
Este punto de interrupción impedía, por la misma razón, que se activara el otro método de delegado. Tan pronto como los eliminé, todo funcionó bien.
Espero que esto ayude a otros, ya que me estaba volviendo loco.
Acabo de probar tu código y todos los métodos están siendo llamados. Debe ser un fallo.
Pasos para la resolución de problemas:
Eliminar aplicación -> Reiniciar el simulador -> Limpiar carpeta de compilación -> Reconstruir -> Ejecutar. También puede intentar ejecutar primero en un simulador diferente para ahorrar tiempo.