我已向UILongPressGestureRecognizer
添加了UICollectionViewCell
并创建了一个segue,因此通过长按cell
,用户会转到ViewController
。
我已经使用didSelect
方法显示一个普通的segue来显示单元格详细信息,但是辅助长按手势segue将用户带到操作屏幕以删除该单元格。
不幸的是,当使用prepareForSegue
将单元格数据发送到destinationViewController
时,我无法使用标准let indexPaths = self.collectionView.indexPathForSelectedRow()
方法,因为我在使用手势识别器时创建了自己的选择。
那么如何使用destinationViewController
将单元数据发送到prepareForSegue
gestureRecognizer
?
if segue.identifier == "cellAction" {
let vc = segue.destinationViewController as! CellActionViewController
//This will cause an 'array index out of range error
let indexPaths = self.collectionView.indexPathsForSelectedItems()
let indexPath = indexPaths[0] as! NSIndexPath
//Here is how I would send the cell data
let selectedCell = Items[indexPath.row]
vc.selectedItem = selectedCell
}
答案 0 :(得分:1)
因此,您需要访问已按下的特定单元格,并使用此信息从prepareForSegue(_:sender:)
中获取其索引路径。
首先要注意的是sender
方法上的prepareForSegue
参数。我假设你从你的手势处理函数中调用performSegueWithIdentifier(_:sender:)
。请注意,这也有sender
参数,该参数与传递给prepareForSegue
的对象相同。您可以使用它来传递您的单元格实例。
要注意的第二件事是UIGestureRecognizer
具有view
属性,该属性很可能是单元格本身。有了这些知识,您可以将按下的单元格实例传递给prepareForSegue
:
func handleLongPress(longPress: UILongPressGestureRecognizer) {
if longPress.state == .Ended {
performSegueWithIdentifier("cellAction", sender: longPress.view)
}
}
现在,在prepareForSegue
范围内,您可以将sender
转换为您的单元格类,并使用UICollectionView
s indexPathForCell(_:)
方法获取其索引路径:
override prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "cellAction" {
let vc = segue.destinationViewController as! CellActionViewController
if let cell = sender as? MyCell {
let indexPath = collectionView.indexPathForCell(cell)
let selectedItem = items[indexPath.row]
vc.selectedItem = selectedItem
} else {
fatalError("Invalid sender, was expecting instance of MyCell.)
}
}
}