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 (Спасибо!), Но он разместил свой ответ как комментарий, а не как ответ.