3

我正在尝试在我的应用程序中启用拖放作为触发功能的机制。我有一个 TableView 显示用户列表,我有一个 collectionView 可以显示 3 种不同类型的数据 - 但一次只能显示一种类型。

我希望 collectionView 在显示 Type1 数据和 Type3 数据时接受来自 tableView 的“drop”,但不接受 Type2 数据。现在,我的拖放工作正常 - 但它适用于所有 3 种数据类型,我不希望它适用于 Type2 数据。

所以目前,如果它正在显示 Type2 数据,我触发的操作只是忽略丢弃的数据 - 但我想阻止 CollectionView 甚至接受它(如果可能的话)。我不希望用户看到可能下降的视觉指示。

我怀疑我应该为此使用 dropProposal - 但是在阅读了 Apple 文档并使用 Google 和 YouTube 搜索了多个小时的示例之后 - 我完全不知所措。

我知道我应该在这里发布我的问题代码,但我什至想尝试控制它的唯一一件事就是根据我显示的数据类型来操作 collectionView.dropDelegate。我相当有信心正确的解决方案会非常不同 - 但这是我尝试过的:

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

如果你能帮我指出答案,请做。

4

2 回答 2

0

尝试这个,

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

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

}
于 2019-02-21T06:38:20.853 回答
0

在这种情况下,正确的答案是使用 UICollectionViewDropDelegate 中的 collectionView(_:canHandle:) 函数作为放置目标:

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

Apple 文档 - collectionView(_:canHandle:)

将逻辑添加到 UICollectionViewDragDelegate 的其他建议将防止在任何地方拖动单元格 - 在某些情况下这可能是一种好的,甚至更有效的方法 - 但是将逻辑放在 drop 委托中可以提供更大的灵活性和有多个放置目标,并非所有放置目标都将失效。

@Bill 提供了这个问题的正确答案(谢谢!),但他将他的回复作为评论发布,而不是答案。

于 2019-02-27T15:57:57.450 回答