【问题标题】:Passing value to another ViewController upon selecting cell in UICollectionView在 UICollectionView 中选择单元格时将值传递给另一个 ViewController
【发布时间】:2015-04-10 19:29:28
【问题描述】:

我想从 UICollectionView 中选择一个用户名,并将该字符串传递给另一个视图。

我可以使用“didSelectRowAtIndexPath”选择单元格。但是 prepareForSegue 函数在我的选择设置之前运行,并且 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] 输出窗口打印:

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]

    }
  }

【问题讨论】:

  • 你先在哪里打电话给prepareForSegue
  • 昨天问了同样的关于表格视图的问题:stackoverflow.com/questions/29538933/….
  • @Spacedust_ 我将一个故事板转场从收集单元连接到另一个视图控制器。

标签: ios swift xcode6 uicollectionview segue


【解决方案1】:

我是这样解决的:

  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]
    }
  }

【讨论】:

  • 这可行,但您不需要创建 selectedRow 属性。使用performSegueWithIdentifiersender 参数传递您的indexPath。有关更多详细信息,请参阅我的更新答案。如果您的 segue 是您的 cell 和您的 NextViewController 之间的链接,我也会提供答案。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2017-09-27
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多