我有一个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中使用索引路径?
答案 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
}
}
}