使用 prepareForSegue 将 Cell 数据发送到 destinationViewController
Sending Cell data to destinationViewController with prepareForSegue
我在我的 UICollectionViewCell
中添加了一个 UILongPressGestureRecognizer
并创建了一个转场,所以通过长按 cell
用户转场到 ViewController
。
我已经有一个普通的 segue 使用 didSelect
方法来显示单元格详细信息,但是二次长按手势 segue 会将用户带到操作屏幕以删除单元格。
不幸的是,当使用 prepareForSegue
将单元格数据发送到 destinationViewController
时,我无法使用标准 let indexPaths = self.collectionView.indexPathForSelectedRow()
方法,因为我在使用手势识别器时正在创建自己的选择。
那么如何使用 gestureRecognizer
将单元格数据发送到 destinationViewController
和 prepareForSegue
?
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
}
因此您需要访问被按下的特定单元格,并使用此信息从 prepareForSegue(_:sender:)
.
中获取其索引路径
首先要注意的是 prepareForSegue
方法上的 sender
参数。我假设您是通过手势处理函数调用 performSegueWithIdentifier(_:sender:)
。请注意,这还有一个 sender
参数,它与传递给 prepareForSegue
的对象相同。您可以使用它来传递您的单元实例。
第二个要注意的是 UIGestureRecognizer
有一个 view
属性,这很可能是单元格本身。有了这些知识,您可以将按下的单元格实例传递给 prepareForSegue
:
func handleLongPress(longPress: UILongPressGestureRecognizer) {
if longPress.state == .Ended {
performSegueWithIdentifier("cellAction", sender: longPress.view)
}
}
现在,在 prepareForSegue
内,您可以将 sender
转换为您的单元格 class,并使用 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.)
}
}
}
我在我的 UICollectionViewCell
中添加了一个 UILongPressGestureRecognizer
并创建了一个转场,所以通过长按 cell
用户转场到 ViewController
。
我已经有一个普通的 segue 使用 didSelect
方法来显示单元格详细信息,但是二次长按手势 segue 会将用户带到操作屏幕以删除单元格。
不幸的是,当使用 prepareForSegue
将单元格数据发送到 destinationViewController
时,我无法使用标准 let indexPaths = self.collectionView.indexPathForSelectedRow()
方法,因为我在使用手势识别器时正在创建自己的选择。
那么如何使用 gestureRecognizer
将单元格数据发送到 destinationViewController
和 prepareForSegue
?
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
}
因此您需要访问被按下的特定单元格,并使用此信息从 prepareForSegue(_:sender:)
.
首先要注意的是 prepareForSegue
方法上的 sender
参数。我假设您是通过手势处理函数调用 performSegueWithIdentifier(_:sender:)
。请注意,这还有一个 sender
参数,它与传递给 prepareForSegue
的对象相同。您可以使用它来传递您的单元实例。
第二个要注意的是 UIGestureRecognizer
有一个 view
属性,这很可能是单元格本身。有了这些知识,您可以将按下的单元格实例传递给 prepareForSegue
:
func handleLongPress(longPress: UILongPressGestureRecognizer) {
if longPress.state == .Ended {
performSegueWithIdentifier("cellAction", sender: longPress.view)
}
}
现在,在 prepareForSegue
内,您可以将 sender
转换为您的单元格 class,并使用 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.)
}
}
}