使用collectionviewCell使用覆盖函数传递数据进行准备

时间:2019-03-31 13:38:23

标签: ios swift uicollectionview uicollectionviewcell uistoryboardsegue

我正在尝试将AvengersViewController的charName字符串发送到CharViewController。

我在AvengersViewController中使用集合视图。 CharName是CharViewController中的标签。

我正在尝试的工作与表视图完美配合,但是我无法使用collectionViews使它工作...

我正在使用“ lastItemSelectedA”来指示复仇者数组中标签的索引。数据传递的工作原理...我无法获得collectionViewItem的索引与第一个序列一起传递,因此将其设置为null。通过使用默认值0,我已经注意到它确实起作用,但是,当按下单元格时,它不会更改lastItemSelectedA的值,但是在之后……或者至少它不会更新变量。

我已经从堆栈上的解决方案中尝试了至少5种实现方式。

extension AvengersViewController: UICollectionViewDelegate, UICollectionViewDataSource {

 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        lastItemSelectedA = indexPath.item
        //self.performSegue(withIdentifier: "openToCharA", sender: indexPath.item)
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard let identifier = segue.identifier else { return }

        switch identifier {
        case "openToCharA":


            if let destination = segue.destination as? CharViewController {
                destination.charName = avengers[lastItemSelectedA ?? 0].name
            }

            //destination.sounds = sounds
            //guard let indexPath = collectionView.indexPathsForSelectedItems else {return}
            //let sounds = fallen[lastItemSelectedF!].sounds

        default:
            print("unexpected segue identifier")
        }
}

1 个答案:

答案 0 :(得分:1)

如果调用了prepare(for segue,则说明您已从集合视图单元格(而不是从控制器)连接了该序列。

在这种情况下,删除

var lastItemSelectedA : Int

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    lastItemSelectedA = indexPath.item
    //self.performSegue(withIdentifier: "openToCharA", sender: indexPath.item)
}

并从sender参数获取集合视图单元格的索引路径

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "openToCharA" {
        let cell = sender as! UICollectionViewCell
        let indexPath = collectionView.indexPath(for: cell)!
        let destination = segue.destination as! CharViewController
        destination.charName = avengers[indexPath.item].name
    }
}

在这种情况下,强制展开可选对象是可以的。如果正确连接了所有代码,并且代码确实揭示了 design 错误,那么该代码不得崩溃。