使用prepareForSegue将cell数据发送到destinationViewController

时间:2015-08-15 00:28:39

标签: ios swift segue uigesturerecognizer

我已向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
}

1 个答案:

答案 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.)
        }
    }
}