Swift 2.1 - 如何将集合视图单元的索引行传递给另一个视图控制器

时间:2016-03-18 03:55:56

标签: ios swift

我正在尝试将集合视图中所选单元格的indexPath.row发送到目标控制器(详细视图),到目前为止我已完成以下操作

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    let recipeCell: Recipe!

    recipeCell = recipe[indexPath.row]

    var index: Int = indexPath.row

    performSegueWithIdentifier("RecipeDetailVC", sender: recipeCell)
}


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "RecipeDetailVC" {

        let detailVC = segue.destinationViewController as? RecipeDetailVC

        if let recipeCell = sender as? Recipe {
            detailVC!.recipe = recipeCell
            detailVC!.index = index
        }
    }
}

indexPath.row是一种NSIndexPath,所以我试图转换为Int,但我在运行时得到Cannot assign value of type '(UnsafePointer<Int8>,Int32) -> UnsafeMutablePointer<Int8>' to type 'Int'

在目标视图控制器中,我已初始化var index = 0 接收indexPath.row值

知道为什么我在运行时遇到这个错误吗?

4 个答案:

答案 0 :(得分:1)

它是一个collectionView所以我相信你应该使用indexpath.item而不是.row

答案 1 :(得分:1)

didSelectItemAtIndexPath中有以下一行:

var index: Int = indexPath.row

这声明index仅作为此函数的本地。然后在prepareForSegue中你有:

detailVC!.index = index

由于您没有收到编译错误,因此还必须在其他地方定义index。这是didSelectItemAtIndexPath应该设置的其他变量。它可能只是

index = indexPath.row

答案 2 :(得分:1)

将以下内容移出函数并将其设为属性。

var index: Int = indexPath.row

在prepareForSegue中,您有以下内容:

detailVC!.index = index

变量'index'未在类中或本地声明,因此您获得的是名为'index'的函数,其定义为:

func index(_: UnsafePointer<Int8>, _: Int32) -> UnsafeMutablePointer<Int8>

如果你将'index'作为一个属性,它将被用来代替同名函数。

答案 3 :(得分:0)

另一种解决方案可能是:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "RecipeDetailVC" {

        let detailVC = segue.destinationViewController as? RecipeDetailVC

        if let recipeCell = sender as? Recipe {
            detailVC!.recipe = recipeCell
            detailVC!.index = collectionView.indexPathsForSelectedItems()?.first?.item
        }
    }
}
相关问题