在 UICollectionView 中选择单元格时将值传递给另一个 ViewController

Passing value to another ViewController upon selecting cell in UICollectionView

我想 select 来自 UICollectionView 的用户名,并将该字符串传递给另一个视图。

我可以 select 使用 "didSelectRowAtIndexPath" 的单元格。但是 prepareForSegue 函数在我的 selection 设置之前运行,并且 segue 传递了初始值。

我不知道如何在 prepareForSegue 覆盖中获取索引值。如果它是一个 UITableView,我想我可以使用 indexPathForSelectedRow。

这是我拥有的:

  func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    selectedUsername = userNames[indexPath.row]
    selectedRow = indexPath.row

    println ("Cell \(indexPath.row) selected")
  }

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "userSelectSegue") {

      let nextVC = segue.destinationViewController as ViewController;
      nextVC.passedUsername = userNames[selectedRow]

      println("prepareForSegue")

    }
  }

运行 这总是传递 userNames[0] 输出 window 打印:

prepareForSegue
Cell 2 selected

编辑 1: 我基本上认为我想要以下 tableview 代码,但我无法让它为 UICollectionView 工作(即我无法获得单元格编号):

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "userSelectSegue") {

      let nextVC = segue.destinationViewController as ViewController;           
      let indexPath = UserSelectCollection.indexPathForSelectedRow()
      nextVC.passedUsername = userNames[indexPath.row]

    }
  }

这是 iOS 的一般行为。在这种情况下,我实施的是。不要覆盖方法 didSelectRowAtIndexPath。当您点击任何单元格时,然后在函数 prepareForSegue 中。您可以获得发件人对象中的单元格。从该单元格中获取所选项目。获取 indexPath.item。之后从数组中获取对象并将其传递给下一个视图控制器。

我是这样解决的:

  1. 我删除了将收集单元格连接到第二个视图控制器的 segue
  2. 我在两个视图控制器之间创建了另一个 segue(称为标识符 "userSelectSegue")
  3. 添加了对 didSelectItemAtIndexPath 的 performSegueWithIdentifier 调用

代码如下:

  var userNames = ["Bob", "Sally", "Mike", "Mary", "James"]
  var selectedRow = 0

  func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    selectedRow = indexPath.row

    self.performSegueWithIdentifier("userSelectSegue", sender: self)

  }

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "userSelectSegue") {

      let nextVC = segue.destinationViewController as ViewController;
      nextVC.passedUsername = userNames[selectedRow]
    }
  }