UIDropInteractionDelegate executeDrop не вызывается? - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь создать простое тестовое приложение для изучения API Drag and Drop.В этом вопросе я остановлюсь только на сценарии отбрасывания.У меня есть пустой View Controller, с открытым приложением safari (многозадачность), а затем я пытаюсь перетащить изображение из Google в представление View Controller.

Я могу перетащить изображение из safari в View Controller моего приложения, но когда я отпускаю, этот вызов ниже никогда не вызывается:

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

Это мой код:

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)")
    }


}

Вызваны два верхних метода, этот:

func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool

и этот:

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

Итак, я пытаюсь выяснить, почему этот:

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

никогда не вызывается.

Есть предложения?

Ответы [ 4 ]

0 голосов
/ 09 июля 2019

В моем случае это была ошибка программирования, где я написал следующее:

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

    return UIDropProposal(operation: .move)
}

Но вы не всегда можете использовать move!Только если session.allowsMoveOperation равно true!

Из документации по перемещению :

Эту операцию можно использовать только в том случае, если в сеансе DropSMoneOperationсвойство верно;в противном случае он обрабатывается как операция UIDropOperation.cancel.[...]

Из отменить документацию :

Если пользователь пытается выполнить операцию удаления, операция перетаскивания отменяется и метод делегата dropInteraction (_: executeDrop :) не вызывается .

0 голосов
/ 22 февраля 2019

Я только что проверил ваш код, и все методы вызывают.Это должен быть сбой.

Действия по устранению неполадок:

Удалить приложение -> Перезапустить симулятор -> Очистить папку сборки -> Восстановить -> Выполнить.Вы также можете сначала попробовать запустить другой симулятор, чтобы сэкономить время.

0 голосов
/ 06 июля 2019

Я столкнулся с этой проблемой и обнаружил, что я не установил для dropdelegate значение self в collectionView.

collectionView.dropDelegate = self

После добавления строки выше в viewDidLoad все заработало !!

override func viewDidLoad() {
    super.viewDidLoad()
    collectionView.dragDelegate = self 
    collectionView.dropDelegate = self
    collectionView.dragInteractionEnabled = true
    collectionView.reorderingCadence = .fast

    // Do any additional setup after loading the view, typically from a nib.
}
0 голосов
/ 22 февраля 2019

@ bhaumik предложение сработало.Xcode по какой-то причине не работает должным образом.Я глубоко очистил и перезапустил Xcode.Теперь это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...