在Swift 4中将数据从CollectionView传递到DetailVC

时间:2019-05-27 03:15:16

标签: ios swift uiviewcontroller segue uistoryboardsegue

我的CollectionView应该将类模型传递给DetailViewController,但是,当我点击一个单元格时,会出现nil错误。

  

致命错误:在隐式展开一个   可选值

CollectionViewController以编程方式嵌入在TabBarController上。

收藏夹视图


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return soundArray.count
    }

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SoundCell", for: indexPath) as? SoundCell {
    let SoundClass = soundArray[indexPath.row]
    cell.updateUI(SoundClass: SoundClass)
    return cell

    } else {
    return UICollectionViewCell()
    }
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    self.performSegue(withIdentifier: "seguetosound", sender: self)

  }

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "seguetosound" {
    if let detailVC = segue.destination as? DetailSecondVC
    let sound = sender as? SoundClass { 
    detailVC.SoundClass = sound 

    }
 }

详细视图控制器

class DetailSecondVC: UIViewController, UIWebViewDelegate {

private var _SoundClass: SoundClass!

var SoundClass: SoundClass {
        get {
            return _SoundClass
        } set {
            _SoundClass = newValue
        }
    }

您知道我在这里想念的吗?我用一个简单的白色屏幕测试了segue,它可以工作,但是当我尝试传递数据时,它失败了。

2 个答案:

答案 0 :(得分:0)

正确的方法是这样。首先,弄清楚您如何触发segue。一种选择是,在didSelect中,以代码触发segue:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    self.performSegue(withIdentifier: "seguetosound", sender: self)
}

但更好的是,只需完全删除didSelectItemAt,并使情节提要中的标记来自单元格即可。这样,当用户点击单元格时,会自动触发segue。

然后,在prepare中,找出选择了哪个索引路径,然后从模型中提取数据并将其传递给目标视图控制器(这可能无法编译,因为您的变量名如此糟糕我看不懂您的代码,但这通常是正确的方法):

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "DetailSecondVC" {
        if let detailVC = segue.destination as? DetailSecondVC {
            if let paths = collectionView?.indexPathsForSelectedItems {
                let row = paths[0].row
                detailVC.SoundClass = SoundClasss[row]
            }
        }
    }
}

答案 1 :(得分:-1)

编辑:我认为解决方案是从视图控制器而不是从单元格中进行选择,但是正如马特所说,从单元格中选择是正确的,但是我只需要删除 didSelectItemAt <的实现/ strong>