如何根据上一个控制器中点击的单元格在视图控制器上呈现数据

时间:2019-07-12 00:20:36

标签: ios swift uicollectionview

我有一个View Controller A,它具有五个静态集合视图单元格,带有标题标签和描述标签。根据被窃听的单元格,我需要找到View Controller B,然后View Controller B将显示与该数据关联的产品列表。

我尝试这样做是didSelect方法,但是我认为我错了...我意识到在使用打印语句后,我可以正确地使导航正常工作,并且我还可以在View Controller A上打印名称标签,但是传递给View Controller B的数据为零。

View Controller A

var个参数:[Parameter] = [         参数(名称:“碱度”,描述:“此处的描述是关于进行稳定测量的重要性”),         参数(名称:“钙”,描述:“此处的描述是关于进行稳定测量的重要性”), //减少金额,所以我在这里不占用太多空间 ]

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
   let selectedCell = parameters[indexPath.row]
    // Create an instance of DeatailViewController and pass that variable
    let destinationVC = DetailViewController()
    destinationVC.dataReceived = selectedCell.name
    self.performSegue(withIdentifier: "segueID", sender: self)

}

视图控制器B

仅打印声明。

预期:将我点击的单元格的名称传递给第二个VC(暂时),但是我想在名称标签中显示与每个元素相关的产品列表。例如:“碱度”将显示“碱度”产品(我是否应该在不同模型中对此进行定义)?

错误: 在VCB上显示nil

建议:

也许在didSelectRow中使用索引路径?

2 个答案:

答案 0 :(得分:1)

使用segue传递数据时,您需要实现prepareForSegue

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    self.performSegue(withIdentifier: "segueID", sender:parameters[indexPath.row]) 
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "segueID" {
         let vc = segue.destination as! DetailViewController
         destinationVC.dataReceived = sender as! Model // Model is type of array parameters
    }
}

但是使用vc实例化DetailViewController(),您需要使用present / push

let destinationVC = DetailViewController()
destinationVC.dataReceived = selectedCell.name
self.present(destinationVC,animated:true)

第二种方式显示DetailViewController()会导致应用程序崩溃,因为您没有从情节提要中加载vc,因此应该像

let vc = self.storyboard!.instantiateViewController(withIdentifier: "DetailID") as! DetailViewController

答案 1 :(得分:0)

如果您使用segue,我可以通过执行以下操作来实现:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "segueID" {
            if let destinationVC = segue.destination as? DetailViewController {
            destinationVC.dataReceived = selectedCell.name
            }
        }
}