Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

311
Visualizações
UIDropInteractionDelegate performDrop no llamado?

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) -> Bool

y éste:

 func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal

Entonces, estoy tratando de averiguar por qué este:

 func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession)

nunca se llama.

¿Cualquier sugerencia?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

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:) .

over 4 years ago · Santiago Trujillo Relatório

0

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.

over 4 years ago · Santiago Trujillo Relatório

0

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.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda