iOS swift 4.2 Как отклонить или запретить добавление в UICollectionView - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь включить перетаскивание в моем приложении в качестве механизма для запуска функции.У меня есть TableView, который отображает список пользователей, и у меня есть collectionView, который может отображать 3 разных типа данных - но только 1 тип за раз.

Я хочу, чтобы collectionView принимал «отбрасывание» изtableView, когда он отображает данные Type1 и Type3, но не для данных Type2.Прямо сейчас мое перетаскивание работает - но оно работает для всех 3 типов данных, и я не хочу, чтобы оно работало для данных типа 2.

Так что в настоящее время действие, которое я запускаю, просто игнорирует отброшенные данныеесли он отображает данные Type2 - но я бы хотел, чтобы CollectionView даже не принял его (если это возможно).Я не хочу, чтобы пользователи видели визуальную индикацию того, что падение возможно.

Я подозреваю, что мне следует использовать dropProposal для этого - но после прочтения документации Apple и нескольких часов поиска в Google иПримеры для YouTube - я в полной растерянности.

Я знаю, что я должен опубликовать здесь неработающий код со своим вопросом, но единственное, о чем я даже подумал, - попробовать и управлял этим, чтобы манипулировать collectionView.dropDelegate на основе типа данных, который я отображал.Я вполне уверен, что правильное решение будет совсем другим - но вот что я попробовал:

if collectionMode != "Type2" {
  collectionView.dropDelegate = self
} else {
  collectionView.dropDelegate = nil
}

Если вы можете помочь мне указать ответ, пожалуйста, сделайте.

Ответы [ 2 ]

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

В этом случае правильным ответом было использование функции collectionView (_: canHandle :) в UICollectionViewDropDelegate для цели удаления:

func collectionView(_ collectionView: UICollectionView, canHandle session: UIDropSession) -> Bool {
    if self.collectionMode == "Type2" {return false}
    return true
}

Документация Apple - collectionView (_: canHandle:)

Другие предложения по добавлению логики в UICollectionViewDragDelegate предотвратят перетаскивание ячейки ЛЮБОЕ - что может быть правильным, а в некоторых случаях даже более эффективным подходом - однако помещение логики в делегат отбрасывания позволяетдля большей гибкости и в случае, когда есть несколько целей отбрасывания, и не все из них должны быть признаны недействительными.

Правильный ответ на этот вопрос был предоставлен @Bill (Спасибо!), но он опубликовал свой ответ каккомментарий, а не ответ.

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

Попробуйте,

func collectionView(_ collectionView: UICollectionView, 
        dragSessionWillBegin session: UIDragSession){

     guard if collectionMode == "Mode2" else { return }
     :
     :
     // Do stuff

}
...