Ios 获取collectionView单元格的indexPath

Ios 获取collectionView单元格的indexPath,ios,uicollectionview,Ios,Uicollectionview,我想将数据从collectionView单元格传递到另一个视图控制器。我已经走了这么远,但我被卡住了。基本上,我希望将collectionView单元格内的标签文本从另一个视图控制器传递到标签。下面的代码不起作用。我想我需要添加一些代码来告诉哪个单元格被点击了。顺便说一句,当我将此行viewController.dataLabelObject=valueToPass更改为此viewController.dataLabelObject=Hello时,我可以在另一个控制器上看到它 var value

我想将数据从collectionView单元格传递到另一个视图控制器。我已经走了这么远,但我被卡住了。基本上,我希望将collectionView单元格内的标签文本从另一个视图控制器传递到标签。下面的代码不起作用。我想我需要添加一些代码来告诉哪个单元格被点击了。顺便说一句,当我将此行viewController.dataLabelObject=valueToPass更改为此viewController.dataLabelObject=Hello时,我可以在另一个控制器上看到它

var valueToPass: String!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
        if segue.identifier == "mySegue"
        {
            let viewController = segue.destination as! AnimalsViewController1
            viewController.dataLabelObject = valueToPass
        }
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
    {
        let currentCell = myCollectionView.cellForItem(at: indexPath) as! CollectionViewCell1
        valueToPass = currentCell.textLabel.text


        performSegue(withIdentifier: "mySegue", sender: self)
    }

你完全错了。首先,您不应该从标签传递数据,最好将字符串存储在控制器中:

var strings: [Strings]!
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
    if segue.identifier == "mySegue"
    {
        let viewController = segue.destination as! AnimalsViewController1
        print("In \(#function), valueToPass = \(valueToPass)")
        viewController.dataLabelObject = valueToPass
    }
}
然后,选择单元格时,将indexPath作为发送方传递:

为赛格做准备:

let indexPath = segue.sender as! IndexPath
let string = strings[indexPath.item]
viewController.dataLabelObject = string

你需要调整你的思维。单元格不存储数据,而是显示数据并从用户处收集输入

与其尝试从用户点击的单元格中提取数据,不如获取所选单元格的索引路径并在数组中查找数据。同时添加打印语句以了解发生了什么:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
{
    valueToPass = myArray[indexPath.row]
    print("In \(#function), valueToPass = \(valueToPass)")
    performSegue(withIdentifier: "mySegue", sender: self)
}
然后将该数据传递到目标视图控制器:

var strings: [Strings]!
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
    if segue.identifier == "mySegue"
    {
        let viewController = segue.destination as! AnimalsViewController1
        print("In \(#function), valueToPass = \(valueToPass)")
        viewController.dataLabelObject = valueToPass
    }
}

在目标视图控制器中添加一条打印语句,以便在加载dataLabelObject时记录其值。

您试图解决问题的方法根本错误。视图不打算承载数据,这是模型的工作。也就是说,您可以首先获取提供标签值的模型,然后传递该值。您可以这样做,但这不是标准做法。我不会写一个暗示这是解决这个问题的方法的答案。@Duncac ofc,这是错误的,我想在答案后面附加详细信息。我建议这样说,一个选项是在调用PerformsgueWithIdentifier:sender:时使用sender参数,将参数传递到preparefor:sender:方法中。这很不传统,但很有效。好吧,我做到了。当我运行我的应用程序时,我在控制台上的preparefor:sender:,valueToPass=nil中的collectionView中得到了这一信息,didSelectItemAt:,valueToPass=Optionalcat中的preparefor:sender:,valueToPass=Optionalcat valueToPass在第一个中为零,但在最后一个中有一个值。而且它不会出现在第二个视图控制器中,听起来像是调用了一个segue两次。你是否有一个序列直接链接到你的单元格,并在didSelectItemAt中调用它?为什么投反对票?如果你觉得我的答案有点欠缺,请告诉我为什么?在你的收藏视图中注释掉这个段落。这种情况还会发生吗?如果是这样的话,你就有了2段。可能一个来自故事板,一个来自代码。如果是这样,请从情节提要中删除segue并取消对collectionView中的segue的注释。\uuIdSelectItemat:您仅从代码中调用segue一次。我没有否决投票。为什么我要对一个试图帮助我的人这样做?顺便说一句,你是对的,我从我的手机中删除了我的segue到viewcontroller,而不是我创建了一个新的segue,从第一视图控制器到第二视图控制器,它工作了。非常感谢你的帮助