iOS swift 4.2 Как отклонить или запретить добавление в UICollectionView

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

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

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

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

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

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

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

2 ответа

Попробуй это,

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

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

}

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

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

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

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

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

Другие вопросы по тегам