在iOS 11和Swift 4中拖放表格视图单元格

在IOS 11中,UITableView添加了一些专门的API,用于将tableView行从一个tableView拖放到另一个tableView。 对于拖放,我们需要实现委托UITableViewDragDelegate和UITableViewDropDelegate。 UITableView和UICollectionView都具有拖放API(协议)。 对于UICollectionView,可以按照本教程进行操作。

这些代表完全独立,我们可以根据需要使用任何一个代表进行拖放。 两者都适用于拖放。

注意:-请注意, iPhoneiPad均支持拖放功能,在iPad上,不同应用程序,同一应用程序和同一屏幕之间可使用拖放功能,但在iPhone中,仅可在相似屏幕上使用拖放功能。

通过使用CollectionViewDataSource和CollectionViewDelegate方法在同一屏幕上创建带有两个tableView的基础项目。 您可以从此处下载基础项目。

现在,我们开始拖放代理,以将tableView行从FirstTableView移至SecondTableView。 为了回调UITableViewDragDelegate,我们需要在viewDidLoad()方法中设置.dragDelegate

 覆盖func viewDidLoad(){ 
super.viewDidLoad()
self.topTableView.dragDelegate =自我
}

为了启用拖动吸引力,我们需要设置表格视图的dragInteractionEnabled属性。 在viewDidLoad方法中启用此属性。 此属性的默认值在iPad上为true,在iPhone上为false。

self.topTableView.dragInteractionEnabled = true 

在UITableViewDragDelegate中,只有一个必需的方法 itemForBeginning用于支持拖动项。

tableView(_:itemsForBeginning:at 🙂 ->提供项目以开始与给定indexPath相关的拖动。 如果返回一个空数组,则拖动会话将不会开始。

  • NSItemProvider
  • UIDragItem

NSItemProvider- >通过使用此类,您可以创建数据或文件的对象,以便在拖放期间在进程之间传送数据或文件。

UIDragItem- >从一个位置拖动到另一个位置的基础数据项的表示。

 扩展ViewController:UITableViewDragDelegate { 
func tableView(_ tableView:UITableView,itemsForBeginning会话:UIDragSession,在indexPath:IndexPath)-> [UIDragItem] {
让dragItem = self.dragItem(forPhotoAt:indexPath)
返回[dragItem]
}
///辅助方法
私人功能dragItem(forPhotoAt indexPath:IndexPath)-> UIDragItem {
让imageName = self.arrayFirst [indexPath.row]
让数据= arrayFisrtProfileData [indexPath.row]
让字符串= data.profileImageName
让itemProvider = NSItemProvider(对象:字符串作为NSItemProviderWriting)
让dragItem = UIDragItem(itemProvider:itemProvider)
dragItem.localObject = imageName
返回dragItem
}
}
  1. 创建一个或多个NSItemProvider对象。 使用项目提供程序表示表行的数据。
  2. 将每个项目提供程序对象包装在UIDragItem对象中。
  3. 考虑为每个拖动项目的localObject属性分配一个值。 此步骤是可选步骤,但可以更快地在同一应用程序中拖放内容。
  4. 从您的方法返回拖动项。

tableView(_:itemsForAddingTo:at:point 🙂 ->此方法用于将项目添加到活动拖动会话中。 当拖动会话处于活动状态并且用户想要添加更多行时,时间表将调用此方法。 我们现在可以触摸添加项目了。
(或者我们可以说,对于选择多个项目,我们使用此方法)

tableView(_:dragPreviewParametersForRowAt 🙂 ->当我们在拖动时仅需要拖动项目的特定位置时,使用此方法。

  func tableView(_ tableView:UITableView,dragPreviewParametersForRowAt indexPath:IndexPath)-> UIDragPreviewParameters?  { 
返回PreviewParameters(forItemAt:indexPath)
}
///辅助方法
私人功能func PreviewParameters(forItemAt indexPath:IndexPath)-> UIDragPreviewParameters? {
让cell = self.topTableView.cellForRow(at:indexPath)as! TopTableViewCell
让previewParameters = UIDragPreviewParameters()
PreviewParameters.visiblePath = UIBezierPath(rect:cell.imageViewProfile.frame)
返回previewParameters
}

首先,我们设置dropDelegate来获取UICollectionViewDropDelegate方法的回调 。 我们在viewDidLoad()方法中设置此属性。

 self.bottomTableView.dropDelegate = self 

与dragDelgate相同,放置委托还具有一种必需的performDropWith方法来支持放置项目。

tableView(_:performDropWith 🙂使用此方法将拖放的内容集成到表视图中。 我们获取destinationIndePath,并获取与拖动操作关联的UIDragItem对象。 通过使用这些对象,我们更新了tableView数据源和table View本身。
我们可以为必须异步加载的任何数据插入占位符行。(我们将在以后的博客中讨论此属性)

 扩展ViewController:UITableViewDropDelegate { 
func tableView(_ tableView:UITableView,performDropWith协调器:UITableViewDropCoordinator){
让destinationIndexPath:IndexPath
如果让indexPath = coordinator.destinationIndexPath {
destinationIndexPath = indexPath
}其他{
让节= tableView.numberOfSections-1
让row = tableView.numberOfRows(inSection:部分)
destinationIndexPath = IndexPath(行:行,部分:节)
}
coordinator.session.loadObjects(ofClass:NSString.self){
守卫让字符串=项目为? [String] else {return}
var indexPaths = [IndexPath]()
用于string.enumerated()中的(索引,值){
让indexPath = IndexPath(row:destinationIndexPath.row + index,section:destinationIndexPath.section)
self.arraySecond.insert(value,at:indexPath.row)
indexPaths.append(indexPath)
}
tableView.insertRows(at:indexPaths,with:.automatic)
}
}
}

其他可选的DropDelegate

DropDelegate还具有其他方法来处理tableView中的放置。 但是这些方法是可选的。

tableView(_:canHandle 🙂 ->此方法用于处理放置会话。 询问您的代表是否可以接受指定类型的数据。

  func tableView(_ tableView:UITableView,canHandle session:UIDropSession)-> Bool { 
返回session.canLoadObjects(ofClass:NSString.self)
}

UITableViewDropProposal

DropDelagte具有可选的方法UITableViewDropProposal,用于处理表视图中的放置。 当我们将手指放在项目上并放下该项目时,放置提案具有处理放置的属性。
DropProposal具有操作枚举,该枚举确定当用户放置拖动项时我们如何解决拖放活动。 意味着我们需要删除该项目或不删除该项目,并且该项目是否与tableView兼容。

………………………………遵循此developerfly.com以获得完整的教程


最初于 2018年1月3日 发布在 developerfly.com 上。